- 단순히 정적 필드와 정적 메서드만을 담은 클래스는 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이다.
- 하지만, 분명 나름의 쓰임새가 있다.
- 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();
}
...
}