이론/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
반응형