같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 사이에서도 서로 호출이 가능하다. (생성자에서 생성자를 호출한다는 건 처음 안 정보)
단, 다음의 두 조건을 만족시켜야 한다.
class House {
String roomType;
String viewType;
int size;
House(String roomType) {
size = 4;
House(roomType, "ocean", 6); // 에러 발생
}
}
위와 같이 코드를 작성하게 되면 에러가 발생한다.
생성자 내에서 다른 생성자를 호출 할 때는 'House' 대신 'this'를 사용해야하는데 그러지 않았다.
생성자 호출이 첫 번째 줄이 아닌 두 번째 줄이기 때문이다.
2번 이유는 생성자 내에서 다른 초기화 작업을 한 이후에 생성자를 다시 호출하게 되면 이전에 초기화한 작업이 무의미해지기 때문이다.
위의 코드를 알맞게 고치면 아래와 같다.
House(String roomType) {
this(roomType, "ocean", 6);
}
생성자 House()에서 또 다른 생성자 House(String roomType, String viewType, int size)를 호출했다.
House() {
roomType = "standard";
viewType = "ocean";
size = 6;
}
↓↓↓↓↓
House() {
this("standard", "ocean", 6);
}
두 코드 같은 일을 하지만 아래의 코드는 생성자를 활용해서 더 간략하게 표현하였다.
처음엔 아래가 어떤 면에서 더 간략할까 싶었는데, 인스턴스 변수가 늘어나거나, 생성자를 여러개 있는 상황에서는 가장 마지막 생성자에서만 초기화 작업을 해주면 코드의 길이가 짧아질 수 있겠구나 라는 생각이 들었다.
같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이렇게 서로 호출하여서 서로 연결해주면 더 좋은 코드를 얻을 수 있다. 그리고 수정이 필요한 경우에도 보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다.
요약
this(), this(매개변수)
생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.참고 | this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것이다. this는 '참조 변수' 이고 this()는 '생성자'이다.
House(House h) {
roomType = h.roomType;
viewType = h.viewType;
size = h.size;
}
House 인스턴스의 참조변수를 매개변수로 전달 받는다. 매개변수로 넘겨진 참조변수 h가 가르키는 House인스턴스의 인스턴스 변수들의 값을 인스턴스 자신으로 복사하는 것이다.
두 인스턴스는 동일한 상태를 갖게 된다.
House h1 = new House();
House h2 = new House(h1);
h2는 h1을 복사하여 생성하였기 때문에 같은 상태를 갖는다. 하지만 서로 독립적인 메모리 공간에 존재하는 별도의 인스턴스이므로 h1의 값이 변경되어도 h2는 영향을 받지 않는다.