본문 바로가기
Language/Java

Effective Java 2장 - Item3: private 생성자나 열거 타입으로 싱글턴임을 보증하라

by limeeggpapa 2025. 6. 15.

  • 핵심 개념

애플리케이션 전체에서 단 하나의 인스턴스만 존재하도록 보장하는 패턴입니다.

  • 장점
  1. 전역적인 상태를 관리하거나, 유일해야 하는 시스템 컴포넌트(ex. 설정 관리자)에 유용합니다.
  • 단점
  1. 클라이언트 코드가 싱글턴에 강하게 결합되어 테스트하기 어렵습니다. (의존성 주입으로 완화 가능)
  2. 상속이 불가능합니다.

💡 예제 비교

❌ 잘못된 예 (public static final 필드 방식)

 

public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    private Elvis() { }

    public void leaveTheBuilding() { /* ... */ }
}
  • 간결하지만, 리플렉션을 통해 private 생성자를 호출하면 여러 인스턴스를 만들 수 있어 싱글턴이 깨질 수 있습니다.

⭕ 잘된 예 (열거 타입 방식)

 

public enum Elvis {
    INSTANCE; // 단 하나의 인스턴스

    public void leaveTheBuilding() { /* ... */ }
}
  • 가장 좋은 방법. 코드가 매우 간결합니다.
  • 복잡한 직렬화나 리플렉션 공격에도 완벽하게 싱글턴을 보장합니다.