C#에서 생성자가 없는 클래스도 디버깅 시작(F5)을 해보면 정상적으로 컴파일이 되는 것을 확인할 수 있습니다. 그렇다면 생성자(constructor)가 없음에도 어떻게 클래스가 구성이 되는지 그 과정을 알아봅시다. 오늘의 예제 자료는 다음과 같습니다.
- Parent 클래스가 있고 해당 클래스를 상속하는 Child 클래스가 있습니다.
- Parent 클래스는 멤버 i (기본값 0)가 있고 생성자에서 i = 1;로 설정합니다.
- Child 클래스는 생성자가 없습니다. (주석 처리하여 없습니다.)
- 이때 Child 클래스를 선언하여 ChildClass.i의 값을 출력하면 무슨 값이 나올까요, 0일까요? 1일까요?
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()'의 메서드 또는 속성 간 호출이 모호합니다.
변수 및 메서드 할당 순서는 다음과 같습니다.
- Child 클래스 멤버 할당
- Parent 클래스 멤버 할당
- Parent 클래스 생성자 실행
- Child 클래스 생성자 실행