Effective Java 공부
인스턴스로 만들어 쓰려고 설계하지 않은 클래스들이 있다.
(ex: 정적 멤버만 담은 정적 유틸리티 클래스
)
이 때 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다.
즉 매개변수를 받지 않는 public
생성자가 만들어지면 사용자는 이것이 자동 생성된 것인지 구분할 수 없다.
이 때 추상 클래스로는 인스턴스화를 막을 수 없다.
하위 클래스를 만들어 인스턴스화 하면 되기 때문이다.. 또한 사용자가 상속해서 쓰라는 뜻으로 오해할 수 도 있다.
인스턴스화를 막는 방법은 아주 간단하다.
컴파일러가 기본 생성자를 만드는 경우는 명시된 기본생성자가 없을 때이다.
따라서 private 생성자를 추가하면 된다.
public class Test {
// 기본 생성자 방지용 (인스턴스화 방지)
private Test() {
throw new AssertionError();
}
}
명시된 생성자가 private이니 클래스 밖에서는 접근할 수 없다. 꼭 AssertionError
를 던질 필요는 없지만 클래스 안에서 실수라도 생성자를 호출하지 않도록 해준다.
생성자가 존재하지만 호출할 수 없는 것이 직관적이지 않으므로 적절한 주석을 달아주는게 좋겠다.
이 방식은 상속을 불가능하게 하는 효과도 있다. 모든 생성자는 상위 클래스의 생성자를 호출하게 되는데 이를 private으로 선언했으니 하위 클래스가 상위 클래스의 생성자에 접근할 수 없게 된다.