백엔드 개발자 블로그

[Effective Java] Item4. 인스턴스화를 막으려거든 private 생성자를 사용하라 본문

Java

[Effective Java] Item4. 인스턴스화를 막으려거든 private 생성자를 사용하라

backend-dev 2024. 3. 21. 22:52

 

상황

정적 메서드와 정적 필드만을 담은 유틸리티 클래스를 생성하고 싶을 때가 존재합니다.

  • java.lang.Math, java.util.Arrays와 같이 기본 타입 값이나 배열 관련 메서드를 모아둔 것
  • java.util.Collectios와 같이 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아둔 것
  • final 클래스를 상속하여 하위 클래스에 메서드를 넣는 것이 불가능하기에 final 클래스와 관련된 메서드를 모아둘 때

이런 유틸리티 클래스는 인스턴스로 만드려고 설계한게 아니라서, 클래스의 인스턴스화를 막아줘야합니다.


해결책

private접근 제어자를 가진 기본 생성자를 만들어 클래스의 인스턴스화를 막아주면 됩니다.

  • 해당 클래스가 인스턴스화 될 일이 발생하지 않습니다.
  • 상속을 불가능하게 하는 효과도 낼 수 있습니다.

private생성자는 직관적이지 않으니 아래의 코드와 같이 적절한 주석을 달아주면 좋습니다.

 

public class Test {
// 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용)
private Test() { }
}

핵심정리

정적 메서드와 정적 필드만을 담은 유틸리티 클래스를 생성할 때는 private접근 제어자를 가진 기본 생성자를 만들어줘야합니다. 이를 만들어줌으로써 해당 클래스가 인스턴스화 될 일을 방지하고, 상속을 불가능하게 할 수 있습니다.