정적 메서드와 정적 필드만 담은 클래스를 만들고 싶을 때가 있을 것이다.
Util Class (java.lang.Math, java.util.Arrays, ...)
인터페이스 구현 객체 생성을 위한 정적 메서드를 모아두고 싶을 때 (java.util.Collections, ...)
final 클래스와 관련한 메서드들을 모아놓을 때 (final 클래스는 상속이 안되므로)
위 유틸리티 클래스는 인스턴스화를 위해 사용한 것이 아님에도 컴파일 타임에 생성자가 없으면 기본 생성자를 자동으로 만들어줌
추상 클래스로 만드는 것 역시 인스턴스화를 막을 수 없음 -> 하위 클래스를 만들어서 인스턴스화 하면 됨
생성자를 명시하지 않아 기본 생성자가 만들어지는 것이므로 private 생성자를 명시함으로써 해결할 수 있다.
예시 코드
private UtilityClass() {
throw new AssertionError();
}
어떤 환경에서도 클래스가 인스턴스화되는 것을 막아줌
직관적이지 않음 - 생성자는 있는데 쓸 수는 없네?
상속이 불가능함