[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 클래스 생성자 실행
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗