이론/Java

Java Singleton 패턴

공부하려구요 2025. 7. 6. 14:59
728x90
반응형

1. Singleton이란?

"애플리케이션 전체에서 딱 하나의 객체만 생성되도록 보장하는 패턴"

  • 공유 인스턴스 1개만 존재
  • 메모리 절약
  • 전역 접근 가능 (전역 변수처럼 사용됨)

2. 사용 예시?

  • 설정 정보 저장 객체 (Config)
  • DB 연결 객체
  • 로깅 시스템 (Logger)
  • 캐시 관리자
  • 전역 상태 저장 객체

3. 기본 Singleton 구현 (Lazy 방식)

public class Singleton {

    private static Singleton instance; // static: 클래스당 하나

    private Singleton() {
        // 생성자 private → 외부에서 new 불가
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton(); // 필요한 시점에 생성
        }
        return instance;
    }
}

사용 예:

Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

System.out.println(s1 == s2);  // true (같은 객체)

4. Eager 방식 (선 로딩)

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}

미리 만들어두기 때문에 null 체크 불필요
장점: 스레드 안전
단점: 안 쓸 수도 있는 인스턴스를 미리 만듦


5. 스레드 안전한 Singleton (synchronized 사용)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

synchronized → 멀티스레드에서도 안전
단점: 매 호출마다 성능 저하


6. 더블 체크 락 (Double-Checked Locking)

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

실제 생성 시에만 synchronized 적용 → 성능 개선
volatile 키워드로 메모리 안정성 확보


7. Enum 방식 (가장 안전하고 간단한 방법)

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        System.out.println("작업 실행!");
    }
}
Singleton s = Singleton.INSTANCE;
s.doSomething();

장점

  • 직렬화/역직렬화 문제 없음
  • 리플렉션 공격 방어
  • 스레드 안전 보장

정리 요약표

Lazy 필요할 때 생성 멀티스레드 위험
Eager 클래스 로딩 시 생성 안 쓸 수도 있는 객체 생성
synchronized 동기화로 안전 보장 성능 저하
DCL 성능 + 안정성 균형 구현 복잡
Enum 자바 공식 권장 방식 Enum 문법 제한 있음
결론
  • 무조건 1개의 인스턴스만 존재해야 할 때 → Singleton
  • 스레드 환경이면 반드시 스레드 안전 방식 사용
  • 가장 간단하고 안전한 방법: Enum Singleton
728x90
반응형