Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 생성자 오버로딩 완벽 가이드 – 개념부터 실전 예제까지

생성자 오버로딩(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개짜리 생성자가 호출되어 이름과 두 과목의 점수가 모두 설정됩니다.

이처럼 생성자 오버로딩을 활용하면 하나의 클래스에서 상황에 맞는 다양한 초기화 방식을 제공할 수 있으며, 불필요한 중복 코드를 줄이고 객체 생성 과정을 더욱 직관적으로 만들 수 있습니다.