C#에서는 생성자 체이닝(Constructor Chaining)을 통해 하나의 생성자에서 같은 클래스의 다른 생성자나 부모 클래스의 생성자를 호출할 수 있습니다. 이 기능은 코드 중복을 줄이고 초기화 로직을 재사용할 수 있게 해줍니다.
같은 클래스 내 생성자 호출 – this 키워드
동일한 클래스 내에서 오버로딩된 다른 생성자를 호출하려면 this 키워드를 사용합니다. 생성자 선언부 뒤에 콜론(:)과 함께 this()를 붙이면 됩니다.
예제 코드
class Demo{
public Demo(){
System.Console.WriteLine("Parameter less constructor called");
}
public Demo(int firstNumber, int secondNumber) : this(){
System.Console.WriteLine($"{firstNumber} {secondNumber}");
}
public Demo(int firstNumber, int secondNumber, int thirdNumber) : this(firstNumber, secondNumber){
System.Console.WriteLine($"{firstNumber} {secondNumber} {thirdNumber}");
}
}
class Program{
static void Main(){
Demo obj = new Demo(1, 2, 3);
Console.ReadLine();
}
}실행 결과
Parameter less constructor called 1 2 1 2 3
위 예제에서 Demo(1, 2, 3) 생성자가 호출되면, this(firstNumber, secondNumber)에 의해 먼저 두 매개변수 생성자가 실행되고, 이어서 this()에 의해 매개변수 없는 생성자까지 연쇄적으로 호출됩니다. 즉, 호출 순서는 가장 마지막에 도달한 생성자부터 역순으로 실행됩니다.
부모 클래스의 생성자 호출 – base 키워드
상속 관계에서 부모(기반) 클래스에 정의된 생성자를 호출하려면 base 키워드를 사용합니다.
예제 코드
class DemoBase{
public DemoBase(int firstNumber, int secondNumber, int thirdNumber){
System.Console.WriteLine("Base class Constructor");
System.Console.WriteLine($"{firstNumber} {secondNumber} {thirdNumber}");
}
}
class Demo : DemoBase{
public Demo(int firstNumber, int secondNumber, int thirdNumber) : base(firstNumber, secondNumber, thirdNumber){
System.Console.WriteLine("Derived class Constructor");
System.Console.WriteLine($"{firstNumber} {secondNumber} {thirdNumber}");
}
}
class Program{
static void Main(){
Demo obj = new Demo(1, 2, 3);
Console.ReadLine();
}
}실행 결과
Base class Constructor 1 2 3 Derived class Constructor 1 2 3
정리
- this(...): 같은 클래스 내의 다른 오버로드된 생성자를 호출할 때 사용합니다.
- base(...): 부모 클래스의 생성자를 호출할 때 사용합니다.
- 두 키워드 모두 생성자 이름 뒤에 콜론(:)과 함께 작성하며, 매개변수 없는 생성자를 호출할 경우 괄호 안을 비우면 됩니다.
- 생성자 체이닝을 활용하면 공통 초기화 코드를 한 곳에 모아 코드 중복을 효과적으로 줄일 수 있습니다.