Notice
Recent Posts
Recent Comments
Link
관리 메뉴

nomad-programmer

[Programming/C#] this() 생성자 본문

Programming/C#

[Programming/C#] this() 생성자

scii 2020. 9. 8. 12:46
class MyClass
{
    int a, b, c;
    
    public MyClass()
    {
        this.a = 555;
    }
    
    public MyClass(int b)
    {
        this.a = 555;
        this.b = b;
    }
    
    public MyClass(int b, int c)
    {
        this.b = b;
        this.c = c;
    }
}

위의 코드는 문제가 있는 코드인가? 그렇지 않다. 문법적으로도 문제가 없고 동작도 잘 될 것이다. 다만 MyClass() 생성자 안에 똑같은 코드가 중복되어 들어가 있다. 비 생성적이다.

이런 고민을 해결해주는 것이 this() 이다. this가 객체 자신을 지칭하는 키워드인 것처럼, this() 는 자기 자신의 생성자를 가리킨다. this() 는 생성자에서만 사용될 수 있다. 그것도 생성자의 코드 블록의 안쪽이 아닌 앞쪽에서만 사용이 가능하다.

다음의 코드는 위의 코드를 this() 생성자를 이용해 개선한 코드이다.

class MyClass
{
    int a, b, c;
    
    public MyClass()
    {
        this.a = 555;
    }
    
    public MyClass(int b) : this()
    {
        this.b = b;
    }
    
    public MyClass(int b, int c) : this(b)
    {
        this.c = c;
    }
}

 

this() 생성자의 예제

using System;

namespace CSharpExample
{
    class MyClass
    {
        int a, b, c;

        public MyClass()
        {
            this.a = 555;
            Console.WriteLine("MyClass()");
        }

        public MyClass(int b): this()
        {
            this.b = b;
            Console.WriteLine($"MyClass({b})");
        }

        public MyClass(int b, int c): this(b)
        {
            this.c = c;
            Console.WriteLine($"MyClass({b}, {c})");
        }

        public void PrintFields()
        {
            Console.WriteLine($"a:{a}, b:{b}, c:{c}");
        }
    }

    class MainApp
    {
        static int Main(string[] args)
        {
            MyClass a = new MyClass();
            a.PrintFields();
            Console.WriteLine();

            MyClass b = new MyClass(1);
            b.PrintFields();
            Console.WriteLine();

            MyClass c = new MyClass(10, 33);
            c.PrintFields();

            return 0;
        }
    }
}

/* 결과

MyClass()
a:555, b:0, c:0

MyClass()
MyClass(1)
a:555, b:1, c:0

MyClass()
MyClass(10)
MyClass(10, 33)
a:555, b:10, c:33

*/
Comments