C# 생성자 오버로딩 마스터하기: 유연한 클래스 설계
C# 생성자 오버로딩 완벽 가이드
매개변수 개수, 타입, 순서를 다양화하여 C# 클래스를 유연하게 생성하는 생성자 오버로딩 기법을 실전 예제와 함께 익혀보세요.
C#의 생성자 오버로딩은 메서드 오버로딩과 동일한 원리입니다. 한 클래스에 이름은 같지만 시그니처(매개변수 목록)가 다른 여러 생성자를 선언할 수 있습니다. 컴파일러는 객체 생성 시 전달된 인수에 따라 적절한 생성자를 선택합니다.
- 매개변수 개수가 다름
- 매개변수 타입이 다름
- 매개변수 순서가 다름
본격적으로 들어가기 전에 C# 기본 생성자 개념을 이해하고 계시길 권장합니다.
1. 매개변수 개수 변경으로 오버로딩
전달하는 인수의 개수를 달리하여 생성자를 오버로딩할 수 있습니다.
class Car {
// 매개변수 없는 생성자
Car() { ... }
// 매개변수 1개 생성자
Car(string brand) { ... }
// 매개변수 2개 생성자
Car(string brand, int price) { ... }
}
이 Car 클래스에서 세 생성자는 각각 시그니처가 다르므로 공존 가능합니다. 컴파일러는 인수 개수에 따라 런타임에 적절한 생성자를 호출합니다.
예제: 매개변수 개수에 따른 오버로딩
using System;
namespace ConstructorOverload {
class Car {
// 매개변수 없는 생성자
Car() {
Console.WriteLine("Car constructor");
}
// 매개변수 1개 생성자
Car(string brand) {
Console.WriteLine("Car constructor with one parameter");
Console.WriteLine("Brand: " + brand);
}
static void Main(string[] args) {
// 매개변수 없는 생성자 호출
Car car = new Car();
Console.WriteLine();
// 매개변수 1개 생성자 호출
Car car2 = new Car("Bugatti");
Console.ReadLine();
}
}
}
실행 결과
Car constructor
Car constructor with one parameter
Brand: Bugatti
컴파일러는 제공된 인수에 따라 적절한 생성자를 호출합니다.
2. 매개변수 타입 변경으로 오버로딩
매개변수 개수는 같지만 타입이 다른 경우에도 오버로딩 가능합니다.
class Car {
Car(string brand) { ... }
Car(int price) { ... }
}
두 생성자 모두 인수를 하나 받지만, 타입이 string과 int로 서로 다릅니다.
예제: 매개변수 타입에 따른 오버로딩
using System;
namespace ConstructorOverload {
class Car {
// string 매개변수 생성자
Car(string brand) {
Console.WriteLine("Brand: " + brand);
}
// int 매개변수 생성자
Car(int price) {
Console.WriteLine("Price: " + price);
}
static void Main(string[] args) {
Car car = new Car("Lamborghini");
Console.WriteLine();
Car car2 = new Car(50000);
Console.ReadLine();
}
}
}
실행 결과
Brand: Lamborghini
Price: 50000
3. 매개변수 순서 변경으로 오버로딩
매개변수의 개수와 타입이 동일하더라도 순서를 바꾸면 별도의 시그니처가 됩니다.
class Car {
Car(string brand, int price) { ... }
Car(int speed, string color) { ... }
}
타입의 순서가 (string, int)와 (int, string)으로 다르므로 오버로딩이 성립합니다.
예제: 매개변수 순서에 따른 오버로딩
using System;
namespace ConstructorOverload {
class Car {
// string 먼저, int 나중
Car(string brand, int price) {
Console.WriteLine("Brand: " + brand);
Console.WriteLine("Price: " + price);
}
// int 먼저, string 나중
Car(int speed, string color) {
Console.WriteLine("Speed: " + speed + " km/hr");
Console.WriteLine("Color: " + color);
}
static void Main(string[] args) {
Car car = new Car("Bugatti", 50000);
Console.WriteLine();
Car car2 = new Car(60, "Red");
Console.ReadLine();
}
}
}
실행 결과
Brand: Bugatti
Price: 50000
Speed: 60 km/hr
Color: Red