자바 생성자(Constructor) 객체 초기화
생성자의 정의와 특징
생성자란?
- 생성자(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·잘못된 데이터 | 생성자 매개변수로 강제 전달 |
| 오버로딩 시 시그니처 중복 | 컴파일 에러 | 매개변수 목록(타입·순서·개수) 다르게 |
생성자 베스트 프랙티스
- 불변 필드는 생성자에서만 설정하고 이후 변경 금지 (
final사용). - 입력 매개변수가 많아지면 빌더 패턴(Builder) 도입해 가독성 향상.
- 오버로딩 체이닝: 공통 로직을 하나의 “메인 생성자”에 모으고
this()로 연결해 중복 제거.
질문 정리
-
기본 생성자를 직접 작성해야 하나요?
매개변수 생성자를 정의하지 않았다면 자동 생성되므로 생략해도 됩니다.
-
정적(static) 필드도 생성자에서 초기화하나요?
아니요.
static필드는 정적 초기화 블록이나 선언 시 값으로 설정합니다. -
생성자에서 다른 메서드를 호출해도 되나요?
가능하지만, 완전히 초기화되기 전 상태에서
this를 외부로 노출하지 않도록 주의하세요. -
예외를 던지는 생성자는 안 좋은가요?
유효성 검사에 실패하면 예외를 던지는 것이 안전합니다. 단, 문서(Javadoc)에 명시하세요.
-
빌더 패턴이 생성자를 대체하나요?
대체라기보다 대규모·가변 매개변수 객체에서 생성자보다 가독성·확장성이 뛰어난 대안입니다.
댓글남기기