[Java] 인스턴스화를 막으려거든 private 생성자를 사용하라

item4. 인스턴스화를 막으려거든 private 생성자를 사용하라

Effective Java 공부


인스턴스로 만들어 쓰려고 설계하지 않은 클래스들이 있다.
(ex: 정적 멤버만 담은 정적 유틸리티 클래스)

이 때 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다.

즉 매개변수를 받지 않는 public 생성자가 만들어지면 사용자는 이것이 자동 생성된 것인지 구분할 수 없다.

이 때 추상 클래스로는 인스턴스화를 막을 수 없다.
하위 클래스를 만들어 인스턴스화 하면 되기 때문이다.. 또한 사용자가 상속해서 쓰라는 뜻으로 오해할 수 도 있다.



인스턴스화를 막는 방법은 아주 간단하다.
컴파일러가 기본 생성자를 만드는 경우는 명시된 기본생성자가 없을 때이다.
따라서 private 생성자를 추가하면 된다.

public class Test {
    // 기본 생성자 방지용 (인스턴스화 방지)
    private Test() {
        throw new AssertionError();
    }
}

명시된 생성자가 private이니 클래스 밖에서는 접근할 수 없다. 꼭 AssertionError를 던질 필요는 없지만 클래스 안에서 실수라도 생성자를 호출하지 않도록 해준다.

생성자가 존재하지만 호출할 수 없는 것이 직관적이지 않으므로 적절한 주석을 달아주는게 좋겠다.


이 방식은 상속을 불가능하게 하는 효과도 있다. 모든 생성자는 상위 클래스의 생성자를 호출하게 되는데 이를 private으로 선언했으니 하위 클래스가 상위 클래스의 생성자에 접근할 수 없게 된다.

좋은 웹페이지 즐겨찾기