[C#] 생성자 없는 클래스 알아보기

C#에서 생성자가 없는 클래스도 디버깅 시작(F5)을 해보면 정상적으로 컴파일이 되는 것을 확인할 수 있습니다. 그렇다면 생성자(constructor)가 없음에도 어떻게 클래스가 구성이 되는지 그 과정을 알아봅시다. 오늘의 예제 자료는 다음과 같습니다.

  • Parent 클래스가 있고 해당 클래스를 상속하는 Child 클래스가 있습니다.
  • Parent 클래스는 멤버 i (기본값 0)가 있고 생성자에서 i = 1;로 설정합니다.
  • Child 클래스는 생성자가 없습니다. (주석 처리하여 없습니다.)
  • 이때 Child 클래스를 선언하여 ChildClass.i의 값을 출력하면 무슨 값이 나올까요, 0일까요? 1일까요?

C# 생성자 없는 클래스

class ParentClass
{
    internal int i = 0;
    internal ParentClass()
    {
        i = 1;
    }
}

class ChildClass : ParentClass
{
    //internal ChildClass() : base()
    //{
    //    i = 0;
    //}
}

void BeomSang()
{
    ChildClass childClass = new ChildClass();
    int is0or1 = childClass.i;
    Debug.WriteLine($"is0or1 => {is0or1}");
}

Debug.WriteLine($"is0or1 => {is0or1}"); 에서 출력하는 값은 1입니다. 왜냐하면 생성자를 명시하지 않더라도 컴파일러가 기본 매개변수로 설정하는 생성자를 할당하기 때문입니다. 예제에서 생략된 생성자는 다음과 같습니다.

internal ChildClass()
{

}

internal ChildClass() : base()
{

}

예시의 ChildClass는 ParentClass를 상속하였기에 base()도 포함이 됩니다. 만약 두 생성자 모두 명시적으로 할당하면 다음과 같은 오류가 발생합니다.

CS0111 : 'ViewBeomSang.ChildClass' 형식은 동일한 매개 변수 형식을 가진 'ChildClass' 멤버를 미리 정의합니다.

CS0121 : 'ViewBeomSang.ChildClass.ChildClass()' 및 'ViewBeomSang.ChildClass.ChildClass()'의 메서드 또는 속성 간 호출이 모호합니다.

변수 및 메서드 할당 순서는 다음과 같습니다.

  1. Child 클래스 멤버 할당
  2. Parent 클래스 멤버 할당
  3. Parent 클래스 생성자 실행
  4. Child 클래스 생성자 실행

댓글