생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
class Card {
Card() { // 매개변수가 없는 생성자
...
}
Card(String k, int num) { // 매개변수가 있는 생성자
...
}
}
Card c = new Card();
class Card {
Card() { } // 기본 생성자: 매개변수도 없고 아무런 내용도 없음
}
기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
class Car {
String color;
String gearType;
int door;
Car() {} // 기본 생성자
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
// 인스턴스변수 값을 일일이 변경해야 함
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// 매개변수를 갖는 생성자를 사용하여 보다 간결하고 직관적인 코드 가능
Car c = new Car("white", "auto", 4);
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
}
Car(String color) {
this(color, "auto", 4);
}
Car(String color, String gearType, int door) {
this.color = color; // this.color = 인스턴스변수, color = 지역변수
this.gearType = gearType;
this.door = door;
}
}
같은 클래스 내의 생성자들은 서로 관계가 깊은 경우가 많아서 이처럼 서로 호출하도록 하여 유기적으로 연결해주면 더 좋은 코드를 얻을 수 있다. 그리고 유지보수가 쉬워진다.
this : 인스턴스 자신을 가리키는 참조변수로, 인스턴스의 주소가 저장되어 있다.
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
this(), this(매개변수) : 생성자로, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
}
Car(Car c) { // 인스턴스의 복사를 위한 생성자
this(c.color, c.gearType, c.door); // 기존의 생성자를 활용함
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car(c1); // c1의 복사본 c2를 생성한다.
}
}
무작정 새로 코드를 작성하는 것보다 기존의 코드를 활용할 수 없는지 고민해야 한다.
인스턴스를 생성할 때 고려해야 할 사항
- 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
- 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?