NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 17-3. 클래스의 생성자 오버로딩. (Overloading constructor using the "this…

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 클래스에 대해 알아보는 3번째 시간이군요^^; 요즘은 세월이 야속하다는 말이 세삼 가슴에 와 닿네요-_-; 나이를 먹어가나봅니다.

     

    이전에 했던 메서드 오버로딩처럼 생성자도 오버로딩이 가능합니다. 다만, 생성자는 특별한 형태의 메서드라서 오버로딩하는 방법이 다를뿐입니다. 어떤면에서는 Java의 생성자 오버로딩이 더 좋아보일 수도 있겠으나 일관되지 않은 동작 때문에 문제가 될수도 있는 부분이라 단정지어서 이야기하기에는 무리가 따릅니다. 아래 예제를 보면서 확인해 보도록 하겠습니다.

    using System;
     
    namespace ThisConstructor
    {
        class NGMasterClass
        {
            string first, second, third;
     
            public NGMasterClass()
            {
                this.first = "First";
                Console.WriteLine("MyClass()");
            }
     
            public NGMasterClass(string second) : this()
            {
                this.second = second;
                Console.WriteLine("MyClass({0})", first);
            }
     
            public NGMasterClass(string second, string third) : this(second)
            {
                this.third = third;
                Console.WriteLine("MyClass({0}. {1})", second, third);
            }
     
            public void PrintFields()
            {
                Console.WriteLine("First: {0}, Second: {1}, Third: {2}", first, second, third);
            }
        }
     
        class MainApp
        {
            static void Main(string[] args)
            {
                NGMasterClass a = new NGMasterClass();
                a.PrintFields();
                Console.WriteLine();
                NGMasterClass b = new NGMasterClass("First");
                b.PrintFields();
                Console.WriteLine();
                NGMasterClass c = new NGMasterClass("Second", "Third");
                c.PrintFields();
                Console.Read();
            }
        }
    }

     

     

    위의 코드에서 라인 15와 21에서 사용된 this를 봐야 합니다. Java와 같이 클래스 상속의 경우 기본 생성자는 맴버가 아니기 때문에 상속이 안되며, 당연히 오버라이딩도 되지 않습니다. 그리고 일반적인 방식(메서드 호출)으로 호출할수도 없습니다. 오직 인스턴스화 할때 컴파일러에서 자동으로 한번만 호출됩니다. 그렇기에 생성자가 내부에서 다른 생성자를 호출할 수 없습니다.

    ※ Java와 달리 C#의 경우 클래스가 생성(인스턴스화)될 때 생성자는 한번만 호출될 수 있어야한다는 룰이 있습니다. 

     

    생성자를 오버로딩하려면 생성자 정의에 this키워드를 사용하여 제어(다른 생성자 호출)를 넘길 수 있습니다. 아래 결과를 보면 제어의 순서를 확인할 수 있습니다. 이렇게 생성자는 생성자의 정의부에서만 다른 생성자를 this키워드를 이용하여 호출할 수 있습니다. 아직 상속에 대한 부분을 진행하지 않아서 언급하지는 않았지만 부모 클래스(기본 클래스 또는 베이스 클래스)의 생성자를 호출할 수도 있습니다. 이럴 때는 base(Java의 경우는 super) 키워드를 사용하여 부모 생성자를 호출할 수 있습니다.

    WLZC6tQ.png

     

     

    다음에는 확장 메서드에 대해서 알아보겠습니다.

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.