생성자 오버로드

황현중·2025년 11월 18일

C#

목록 보기
5/24

🔥 1. 생성자 오버로드란?

생성자 오버로드(Constructor Overloading)란
하나의 클래스에 여러 개의 생성자를 만들어서, 상황에 따라 다른 방식으로 초기화할 수 있게 하는 것입니다.


public class Person
{
    public Person() { }
    public Person(string name) { }
    public Person(string name, int age) { }
}

➡ 호출자가 필요한 만큼의 정보만 제공해 객체를 생성할 수 있습니다.


🚀 2. 실무에서 중요한 생성자 오버로드 전략 핵심 3가지

✔ ★ 전략 1 — 가장 작은 생성자가 “메인 생성자”가 되게 만들기

즉, 공통 초기화 코드를 한 곳에 몰아넣는 전략입니다.

❌ 안 좋은 예 (중복 코드 발생)


public class User
{
    public string Id;
    public int Level;

    public User()
    {
        Id = "guest";
        Level = 1;
    }

    public User(string id)
    {
        Id = id;
        Level = 1;
    }

    public User(string id, int level)
    {
        Id = id;
        Level = level;
    }
}

➡ Id/Level 초기화 코드가 3곳에 중복 → 유지보수 어려움

✔ 좋은 예 (this() 활용, 중복 제거)


public class User
{
    public string Id;
    public int Level;

    // 메인 생성자
    public User(string id, int level)
    {
        Id = id;
        Level = level;
    }

    public User() : this("guest", 1) { }

    public User(string id) : this(id, 1) { }
}

➡ 공통 로직은 오직 하나의 메인 생성자에만 존재
➡ 나머지 생성자들은 this()로 연결
➡ 실무에서 가장 많이 쓰는 대표 패턴


✔ ★ 전략 2 — “필수값은 생성자”, “옵션값은 Property”

필수값은 생성자로 강제하고,
선택적인 값은 Property로 설정하는 방식입니다.

실무 예제 (회원가입 모델)


public class Member
{
    // 필수값
    public string Id { get; }
    public string Password { get; }

    // 선택값
    public string Email { get; set; }
    public string Phone { get; set; }

    public Member(string id, string password)
    {
        Id = id;
        Password = password;
    }
}

사용 예:


var m = new Member("hong", "1234")
{
    Email = "hong@test.com",
    Phone = "010-0000-0000"
};

➡ 필수값은 생성자로 강제
➡ 선택값은 Property로 후처리
➡ API/도메인 모델 설계에서 자주 쓰는 패턴


✔ ★ 전략 3 — “생성자 체이닝 + 유효성 검사” 조합

객체 생성 시 입력값이 잘못되지 않도록 메인 생성자에서 유효성 검사를 처리하고,
다른 생성자들은 this()로 연결하는 전략입니다.


public class Product
{
    public string Name { get; }
    public int Price { get; }

    public Product(string name, int price)
    {
        if (string.IsNullOrWhiteSpace(name))
            throw new ArgumentException("제품명은 필수입니다.");

        if (price < 0)
            throw new ArgumentException("가격은 0보다 커야 합니다.");

        Name = name;
        Price = price;
    }

    public Product(string name) : this(name, 0) { }
}

➡ 유효성 검사는 메인 생성자에서만
➡ 나머지 생성자는 this()로 연결하여 코드 중복 방지


🚀 3. 실무에서 생성자 오버로드가 필요한 상황들

✔ 1) 다양한 초기화 방식을 제공해야 할 때

예: 파일 객체


public class FileLoader
{
    public FileLoader(string path) { }
    public FileLoader(Stream stream) { }
    public FileLoader(byte[] bytes) { }
}

✔ 2) 초기 상태를 다양하게 구성해야 할 때

게임 캐릭터 예시


public Character() : this("Unknown", 1) { }
public Character(string name) : this(name, 1) { }
public Character(string name, int level)
{
    Name = name;
    Level = level;
}

✔ 3) 기본값(Default Value)을 제공해야 할 때


public Report(string title) : this(title, DateTime.Now) { }

public Report(string title, DateTime date)
{
    Title = title;
    Date = date;
}

🚀 4. 가장 좋은 생성자 오버로드 구조

✔ 권장 템플릿


public class Sample
{
    private int _a;
    private int _b;
    private int _c;

    // 메인 생성자
    public Sample(int a, int b, int c)
    {
        _a = a;
        _b = b;
        _c = c;
    }

    public Sample(int a, int b) : this(a, b, 0) { }
    public Sample(int a) : this(a, 0, 0) { }
    public Sample() : this(0, 0, 0) { }
}

✔ 장점

  • 중복 제거
  • 로직 유지보수 쉬움
  • 에러 발생 확률 감소
  • 객체 설계가 매우 깔끔해짐

🚀 5. 결론 요약

✔ 생성자 오버로드 핵심 정리

  • 공통 초기화 로직은 메인 생성자에만 배치
  • 나머지 생성자는 this()로 체이닝
  • 필수값은 생성자로 강제
  • 선택값은 Property로
  • 유효성 검사는 메인 생성자에서만 진행
  • 중복 코드 최소화 = 유지보수성 향상

0개의 댓글