6.3 생성자 (Constructor)
클래스로부터 객체를 생성할 때, 생성과 동시에 인스턴스 변수들을 적절한 값으로 자동으로 초기화해주는 메서드와 매우 유사한 구조를 가진 것을 바로 생성자(Constructor) 라고 부릅니다.
1. 생성자의 조건 및 특징
- 생성자의 이름은 무조건 클래스의 이름과 완전히 같아야 합니다.
- 일반 메서드와 달리 리턴 값이 전혀 없으며,
void조차 붙이지 않습니다. - 인스턴스를 생성할 때 (즉
new키워드를 사용하는 즉시) 단 한 번 실행됩니다.
개발자는 이를 이용해, 객체가 생성될 때 무조건 거쳐가야만 하는 '초기 셋팅 로직'을 강제할 수 있습니다.
class Car {
String color;
String gearType;
// 생성자 (클래스 이름과 동일, 반환 타입 없음)
Car() {
System.out.println("자동차 객체가 갓 만들어졌습니다!");
color = "white"; // 기본 색상을 흰색으로 초기화
gearType = "auto";
}
}
// 사용시 바로 호출됨
Car c = new Car(); // '자동차 객체가 갓 만들어졌습니다!' 출력됨
2. 매개변수가 있는 생성자
생성자도 일반 메서드처럼 호출 시 매개변수를 받을 수 있어서 인스턴스마다 각각 다른 값으로 초기화할 수 있습니다. 각기 다른 개성을 가진 인스턴스를 생산력 있게 만드는데 매우 유용합니다.
class Car {
String color;
String gearType;
int door;
// 매개변수를 받는 생성자
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
// 인스턴스 생성 시 원하는 값들을 함께 넘겨주기
Car c1 = new Car("white", "auto", 4);
Car c2 = new Car("red", "manual", 2);
3. 기본 생성자 (Default Constructor)
사실, 지금까지 우리가 클래스를 만들 때 생성자를 만들지 않아도 new Car()같이 객체를 만들 수 있던 것은, 컴파일러가 알아서 아무 내용이 없는 "기본 생성자"를 몰래 추가해주고 있었기 때문입니다.
Car() { }
그러나 클래스 내부에 매개변수가 있는 등 우리가 사용자가 새로 작성한 생성자가 단 1개라도 선언되어 있다면 컴파일러는 이 기본 생성자를 추가하지 않습니다. 따라서 기본 생성자 형식이 필요하다면 수동으로 추가 선언해두는 것이 안전하고 좋은 습관입니다.