가끔 정적 필드와 정적 메소드만을 갖고 있는 클래스가 필요한 상황이 있습니다. 이러한 유틸리티 클래스는 인스턴스로 사용하기 위해 생성한 것은 아닙니다.
그런데, 이러한 의도를 어떻게 코드로 나타낼 수 있을까요?
생성자를 명시하지 않으면, 컴파일러는 자동으로 기본 생성자를 생성하게 됩니다.
public class UtilityClass {
//기본 생성자
public UtilityClass() {
}
}
기본 생성자의 접근 제어자는 public이죠. 그렇다면 언제든지 외부에서 해당 클래스 인스턴스를 만들 가능성이 있습니다.
-
여기서 추가로, ‘인스턴스를 안 만들려면, 추상 클래스로 만들면 되지 않을까?’ 라고 생각할 수 있지만, 추상 클래스로는 인스턴스를 막을 수 없습니다.
→ 하위 클래스를 생성하여 인스턴스화할 수 있기 때문입니다.
→ 추상 클래스를 상속하여 쓰라는 의미로 이해할 수 있습니다. → 더 큰 문제!
올바른 해결 방법은 private 생성자를 생성하는 것입니다.
public class UtilityClass {
private UtilityClass() {
}
}
그렇다면 외부에서 새로운 인스턴스를 생성하지 못하니, 클래스의 인스턴스 화를 막을 수가 있습니다.
추가적으로 상속도 막을 수 있습니다. (생성자가 private이기 때문에, 상위 클래스의 생성자에 접근할 수가 없습니다.)
조슈아 블로크, 이펙티브 자바 Effective Java 3/E, 2018