2 분 소요

생성자의 정의와 특징

생성자란?

  • 생성자(Constructor) 는 클래스와 동일한 이름을 가진 특별 메서드로, 반환 타입이 없습니다.
  • new 키워드로 객체를 만들 때 단 한 번 호출되어 인스턴스 변수 초기화를 담당합니다.

핵심 특징 정리

  • 클래스명과 동일한 이름
  • 반환 타입 없음(void조차 사용 X)
  • 객체 생성 시 자동 호출
  • 매개변수로 초기값 전달 가능
  • 오버로딩(개수·타입·순서별 다중 정의) 지원

생성자의 주요 역할

1. 인스턴스 변수 초기화

JVM 기본값 대신 원하는 값으로 필드를 설정해 불완전 객체 생성을 방지합니다.

2. 객체 생성 과정 간소화

생성과 초기화를 한 줄에 묶어 코드 가독성안전성을 높입니다.

3. 필수 초기화 강제

필수 필드를 생성자 매개변수로 요구해 누락 오류를 사전에 차단합니다.


생성자 종류와 예제

기본 생성자 (매개변수 없음)

class Car {
    String model = "미정";
    int year;
    // 기본 생성자를 작성하지 않아도 컴파일러가 자동 추가
}
Car car = new Car();   // 기본 생성자 호출

매개변수 생성자

class Car {
    String model;
    int year;
    Car(String model, int year){     // 사용자 정의 생성자
        this.model = model;
        this.year  = year;
    }
}
Car car = new Car("Avante", 2023);

주의: 매개변수 생성자를 직접 선언하면 기본 생성자는 자동 제공되지 않습니다.

생성자 오버로딩

class Car {
    String model; int year; String color;
    Car(){ this("미정", 0, "미정"); }
    Car(String model,int year){ this(model, year, "미정"); }
    Car(String model,int year,String color){
        this.model = model;
        this.year  = year;
        this.color = color;
    }
}

this 키워드 활용

용도 예시
현재 객체 필드 참조 this.model = model;
다른 생성자 호출 this("기본", 0, "흰색");

생성자 호출 흐름

Car myCar = new Car("Sonata", 2025, "파란색");
/*
1. new Car → 힙에 Car 객체 메모리 확보
2. 선택된 생성자 호출 → 필드 초기화
3. 참조 변수(myCar)가 객체 주소 저장
*/

자주 발생하는 오류 & 해결책

상황 증상 해결 방법
매개변수 생성자만 선언 Car() 호출 시 컴파일 에러 직접 기본 생성자 추가
필수 필드 미초기화 NPE·잘못된 데이터 생성자 매개변수로 강제 전달
오버로딩 시 시그니처 중복 컴파일 에러 매개변수 목록(타입·순서·개수) 다르게

생성자 베스트 프랙티스

  1. 불변 필드는 생성자에서만 설정하고 이후 변경 금지 (final 사용).
  2. 입력 매개변수가 많아지면 빌더 패턴(Builder) 도입해 가독성 향상.
  3. 오버로딩 체이닝: 공통 로직을 하나의 “메인 생성자”에 모으고 this()로 연결해 중복 제거.

질문 정리

  1. 기본 생성자를 직접 작성해야 하나요?

    매개변수 생성자를 정의하지 않았다면 자동 생성되므로 생략해도 됩니다.

  2. 정적(static) 필드도 생성자에서 초기화하나요?

    아니요. static 필드는 정적 초기화 블록이나 선언 시 값으로 설정합니다.

  3. 생성자에서 다른 메서드를 호출해도 되나요?

    가능하지만, 완전히 초기화되기 전 상태에서 this를 외부로 노출하지 않도록 주의하세요.

  4. 예외를 던지는 생성자는 안 좋은가요?

    유효성 검사에 실패하면 예외를 던지는 것이 안전합니다. 단, 문서(Javadoc)에 명시하세요.

  5. 빌더 패턴이 생성자를 대체하나요?

    대체라기보다 대규모·가변 매개변수 객체에서 생성자보다 가독성·확장성이 뛰어난 대안입니다.

카테고리:

업데이트:

댓글남기기