생성자 오버로딩(Constructor Overloading)은 같은 클래스 안에 이름이 동일한 생성자를 여러 개 정의하는 것을 말합니다. 단, 각 생성자는 매개변수의 개수, 타입 또는 순서가 서로 달라야 한다는 조건이 있습니다. 이렇게 하면 객체를 생성할 때 다양한 방식으로 초기화할 수 있어 코드의 유연성이 크게 향상됩니다.
생성자 오버로딩의 기본 규칙
- 생성자의 이름은 반드시 클래스 이름과 같아야 합니다.
- 매개변수의 개수, 타입, 순서 중 최소 하나 이상이 달라야 오버로딩으로 인정됩니다.
- 반환 타입만 다른 경우에는 오버로딩이 성립하지 않습니다.
예제 소개
C#에서 생성자 오버로딩이 어떻게 동작하는지 예제를 통해 살펴보겠습니다. 이 예제에서는 두 과목의 점수를 저장할 double 변수와 학생 이름을 저장할 문자열 변수를 선언합니다.
private double SubjectOne; private double SubjectTwo; string StudentName;
세 명의 학생에 대한 과목별 점수를 출력하는 상황을 가정해 보겠습니다. 생성자 오버로딩을 시연하기 위해, 이 예제에서는 세 번째 학생만 이름을 함께 표시하도록 구성했습니다.
Student s1 = new Student(); // 매개변수 없는 생성자 호출
Student s2 = new Student(90); // 매개변수 1개짜리 생성자 호출
Student s3 = new Student("Amit", 88, 60); // 매개변수 3개짜리 생성자 호출위 코드처럼 객체를 생성할 때 전달하는 인자의 형태에 따라 컴파일러가 자동으로 알맞은 생성자를 선택합니다.
전체 예제 코드
아래 코드를 직접 실행해 보면서 C#에서 생성자 오버로딩이 구현되는 과정을 확인해 보세요.
using System;
namespace Program {
class Student {
private double SubjectOne;
private double SubjectTwo;
string StudentName;
// 매개변수가 없는 기본 생성자
public Student() {
this.SubjectOne = 80;
}
// 매개변수 1개짜리 생성자
public Student(double SubjectOne) {
this.SubjectOne = SubjectOne;
}
// 매개변수 3개짜리 생성자
public Student(string StudentName, double SubjectOne, double SubjectTwo) {
this.SubjectOne = SubjectOne;
this.SubjectTwo = SubjectTwo;
this.StudentName = StudentName;
}
public double GetSubjectOneMarks() {
return this.SubjectOne;
}
public double GetSubjectTwoMarks() {
return this.SubjectTwo;
}
public string GetStudentName() {
return this.StudentName;
}
}
class Program {
static void Main(string[] args) {
Student s1 = new Student();
Student s2 = new Student(90);
Student s3 = new Student("Amit", 88, 60);
Console.WriteLine("첫 번째 학생");
Console.WriteLine("1과목 점수: {0}", s1.GetSubjectOneMarks());
Console.WriteLine();
Console.WriteLine("두 번째 학생");
Console.WriteLine("1과목 점수: {0}", s2.GetSubjectOneMarks());
Console.WriteLine();
Console.WriteLine("세 번째 학생");
Console.WriteLine("학생 이름: {0}", s3.GetStudentName());
Console.WriteLine("1과목 점수: {0}", s3.GetSubjectOneMarks());
Console.WriteLine("2과목 점수: {0}", s3.GetSubjectTwoMarks());
Console.ReadKey();
}
}
}실행 결과
첫 번째 학생 1과목 점수: 80 두 번째 학생 1과목 점수: 90 세 번째 학생 학생 이름: Amit 1과목 점수: 88 2과목 점수: 60
코드 설명
실행 결과를 통해 각 객체가 서로 다른 생성자를 사용했음을 확인할 수 있습니다.
- s1: 매개변수가 없으므로 기본 생성자가 호출되어
SubjectOne이 기본값인 80으로 초기화됩니다. - s2:
double타입 인자 하나를 전달했기 때문에 매개변수 1개짜리 생성자가 호출되어 90으로 초기화됩니다. - s3: 문자열과 숫자 두 개, 총 세 개의 인자를 전달했으므로 매개변수 3개짜리 생성자가 호출되어 이름과 두 과목의 점수가 모두 설정됩니다.
이처럼 생성자 오버로딩을 활용하면 하나의 클래스에서 상황에 맞는 다양한 초기화 방식을 제공할 수 있으며, 불필요한 중복 코드를 줄이고 객체 생성 과정을 더욱 직관적으로 만들 수 있습니다.