정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계 했지만, 실제로는 생성자를 명시하지 않았기 때문에 컴파일러가 자동으로 기본 생성자를 만들어준다. 즉, 매개변수를 받지 않는 public 생성자가 만들어짐으로써 사용자는 생성자가 자동 생성된 건지 구분할 수 없다.
<aside> 💡
유틸리티 클래스
특정 기능이나 정적 메서드(static method) 를 모아놓은 클래스를 말한다.
주로 공통적으로 사용되는 기능을 제공하는 데 사용된다.
객체 생성없이 바로 메서드를 사용할 수 있다. ex) Member.instanceOf()
</aside>
인스턴스화를 막는 방법1
추상 클래스 (abstract class)로 만들기
- 이는 하위 클래스를 만들어 인스턴스화하면 그만이다…
인스턴스화를 막는 방법2 ✅
private 생성자를 추가하자!
- 컴파일러는 명시된 생성자가 없을 경우에 자동으로 public 타입의 기본 생성자를 생성한다. 따라서 이를 방지하기 위해 private 생성자를 추가하면 외부 접근을 막고, 인스턴스화를 막을 수 있다.
public class UtilityClass {
// 컴파일러 기본 생성자 생성 방지용
private UtilityClass() {
throw new AssertionError();
}
}
👉 이 방식은 어떤 환경에서도 클래스가 인스턴스화 되는 것을 막아준다. 다만, 이 코드는 그다지 직관적이지 않기 때문에 위 예제와 같이 적절한 주석이 필요하다.
👉 이 방식은 상속을 불가능하게 하는 효과도 있다. 모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하게 되는데, private 으로 선언했기 때문에 하위 클래스가 상위 클래스의 생성자에 접근할 수 없다.