Java - 생성자

WooHyeong·2022년 12월 12일
0

Java

목록 보기
3/4

생성자에서 다른 생성자 호출하기

같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 사이에서도 서로 호출이 가능하다. (생성자에서 생성자를 호출한다는 건 처음 안 정보)
단, 다음의 두 조건을 만족시켜야 한다.

  • 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
class House {
	String roomType;
    String viewType;
    int size;

	House(String roomType) {
		size = 4;
    	House(roomType, "ocean", 6);   // 에러 발생
	}
}

위와 같이 코드를 작성하게 되면 에러가 발생한다.

  1. 생성자 내에서 다른 생성자를 호출 할 때는 'House' 대신 'this'를 사용해야하는데 그러지 않았다.

  2. 생성자 호출이 첫 번째 줄이 아닌 두 번째 줄이기 때문이다.

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);
}

두 코드 같은 일을 하지만 아래의 코드는 생성자를 활용해서 더 간략하게 표현하였다.
처음엔 아래가 어떤 면에서 더 간략할까 싶었는데, 인스턴스 변수가 늘어나거나, 생성자를 여러개 있는 상황에서는 가장 마지막 생성자에서만 초기화 작업을 해주면 코드의 길이가 짧아질 수 있겠구나 라는 생각이 들었다.

같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이렇게 서로 호출하여서 서로 연결해주면 더 좋은 코드를 얻을 수 있다. 그리고 수정이 필요한 경우에도 보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다.

요약

  1. 생성자 내에서 생성자를 호출할 때는 this()를 사용한다.
  2. 생성자 내에서 생성자를 호출할 때는 생성자의 첫 번째 줄에서 호출한다.
  3. 'this'는 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
  4. 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는 영향을 받지 않는다.

profile
화이링~!

0개의 댓글