Posts [Effective Java] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
Post
Cancel

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

  • 단순히 정적 필드와 정적 메서드만을 담은 클래스는 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이다.
  • 하지만, 분명 나름의 쓰임새가 있다.
  • e.g. java.lang.Math, java.util.Arrays, java.util.Collections


유틸리티 클래스

  • 해당 클래스는 인스턴스화하려고 설계한 게 X
  • 생성자를 명시하지 않으면, 컴파일러는 자동으로 매개변수가 없는 public 생성자를 만든다.
  • 사용자는 이 생성자가 자동으로 생성된 것인지 구분할 수 없어 해당 클래스도 인스턴스화할 수 있다.
  • 실제로 공개된 API에서도 이처럼 의도치 않게 인스턴스화할 수 있게 된 클래스가 종종 목격된다.


추상 클래스

  • 해당 클래스로는 인스턴스화를 막을 수 X
  • 하위 클래스로 만들어 인스턴스화할 수 있다.
  • 사용자가 이를 상속해서 활용하란 뜻으로 오해할 수 있어 더 큰 문제이다.


private 생성자

  • 컴파일러는 명시된 생성자가 없을 때만 매개변수가 없는 public 생성자를 만든다.
  • 그러므로 private 생성자를 추가하면, 클래스의 인스턴스화를 막을 수 있다.
  • 이는 어떤 환경에서도 클래스가 인스턴스화되는 것을 막아준다.
  • 또한 상속을 불가능하게 하는 효과도 있다.
  • 모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출한다.
  • 이때 private으로 선언하면, 하위 클래스에서 상위 클래스의 생성자로 접근할 길을 막게 된다.
1
2
3
4
5
6
7
8
public class Utility {
    
    private Utility() {
        throw new AssertionError();
    }

    ...
}
This post is licensed under CC BY 4.0 by the author.

[Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

[Algorithms] 최대공약수, 최소공배수 (GCD, LCM)