static 메서드와 static 필드를 모아둔 클래스를 만든 경우 해당 클래스를 abstract로 만들어도 상속 받아서 인스턴스를 만들 수 있다.
아무런 생성자를 만들지 않은 경우 컴파일러가 기본적으로 아무 인자가 없는 pubilc 생성자를 만들어 주기 때문에 명시적으로 private 생성자를 추가해야 한다.
// 인스턴스를 만들 수 없는 유틸리티 클래스
public class UtilityClass {
// 기본 생성자가 만들어지는 것을 막는다. (인스턴스화 방지용)
private UtilityClass() {
throw new AssertionError();
}
...
}
- AssetionError를 던질 필요는 없지만, 클래스 안에서 실수로라도 생성자를 호출하지 않도록 해준다.
- 생성자가 분명 존재하는데 호출할 수가 없다니, 그다지 직관적이지 않기 때문에 위에 코드처럼 주석을 추가하는 것이 좋다.
- 상속을 불가능하게 하는 효과도 있다. 모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하게 되는데, 이를 private로 선언했으니 하위 클래스가 상위 클래스의 생성자에 접근할 길이 막힌다.