[이펙티브 자바] item4. 인스턴스화를 막으려면 private 생성자를 사용하라

ideal dev·2023년 7월 16일
0

이펙티브 자바

목록 보기
3/3

인스턴스화를 막으려면 private 생성자를 사용하라

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

  • 유틸 클래스를 만들 때 java.lang.Math, java.util.Arrays, java.util.Collections와 같은 유틸 클래스를 구성하는 경우에는 해당 클래스가 쓸데없이 인스턴스화 되는 것을 막아야 한다.객체지향적으로는 곱게 보이지 않을 수 있는 사용방식이다.
    • java.lang.Math, java.util.Arrays 처럼 기본 타입 값이나 배열 과련 메서드를 모아놓을 수 있다.
      - java.util.Collections 처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수도 있다.
      - final클래스와 관련한 메서드들을 모아놓을 때도 사용한다.
      - 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다.

추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다.

  • 클래스를 상속해서 일반 클래스로 정의하면 얼마든지 인스턴스를 생성할 수 있다. 또한 추상클래스의 선언은, 사용자가 이 클래스를 상속해서 구체화해 사용하라는 의도를 표현하기도 하기 때문에 인스턴스화를 막으려는 의도랑은 상충된다.

private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다.

  • 기본 생성자를 명시적으로 private 선언을 해주면 클래스 바깥에서는 접근할 수가 없다.
  • 클래스의 상속을 통한 인스턴스화를 막아주는 효과도 있다. 하위 클래스는 인스턴스화 시점에 상위 클래스의 생성자를 호출하게 되어있는데, private 접근 지정자는 자기 자신 클래스 외에는 다른 클래스에서는 접근이 불가능하기 때문이다.

생성자에 주석으로 인스턴스화 불가한 이유를 설명하는 것이 좋다.
상속을 방지할 때도 같은 방법을 사용할 수 있다.

정리

  • 인스턴스가 만들어지면 안되는 클래스가 있다면 디폴트 생성자를 private으로 만들어놓자.

참고

https://limdingdong.tistory.com/19
백기선강사님 인프런 강의

0개의 댓글