[이펙티브 자바] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

이펙티브 자바를 읽고 정리한 글입니다.

아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라


객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이지만, 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다.

  • java.lang.Math, java.util.Arrays
  • final 클래스와 관련한 메서드들을 모아놓을 때도 사용

정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다.

  • 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다.
  • 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다.
    • 하위 클래스로 만들어 인스턴스화하면 그만이다.

클래스의 인스턴스화를 막는 방법


컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 때뿐이니 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다.

public class UtilityClass {
    // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용).
    private UtilityClass() {
        throw new AssertionError();
    }
    ...
}

명시적 생성자가 private이니 클래스 바깥에서는 접근할 수 없다.

  • 상속을 불가능하게 해준다.

꼭 AssertionError를 던질 필요는 없지만, 클래스 안에서 실수로라도 생성자를 호출하지 않도록 해준다.

하지만 생성자가 분명 존재하는데 호출할 수 없다는 것이 그다지 직관적이지 않다.

  • 적절한 주석을 달아주도록 하자.

좋은 웹페이지 즐겨찾기