자바(Java)에서 **싱글톤 패턴(Singleton Pattern)**은 특정 클래스의 인스턴스를 하나만 생성하고, 전체 애플리케이션에서 공유할 수 있도록 보장하는 디자인 패턴입니다. 주로 공통된 설정, 로깅, 스레드 풀, 캐시, DB 연결 관리 등에 사용됩니다.
✅ 싱글톤 패턴의 핵심 개념
- 클래스의 인스턴스를 하나만 생성.
- 전역 접근점(Global Access Point) 제공.
- 생성자를
private으로 숨김. - 정적 메서드로 인스턴스를 반환.
📦 싱글톤 패턴 구현 예제
1. 기본 싱글톤 (Lazy Initialization)
public class Singleton {
private static Singleton instance;
// 생성자를 private으로 설정하여 외부에서 new로 인스턴스 생성하지 못하도록 함
private Singleton() {}
// 인스턴스를 필요할 때 생성
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void showMessage() {
System.out.println("Hello from Singleton!");
}
}
사용 예시:
public class Main {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
singleton.showMessage();
}
}
2. 스레드 안전한 싱글톤 (Thread-safe)
public class ThreadSafeSingleton {
private static ThreadSafeSingleton instance;
private ThreadSafeSingleton() {}
// synchronized로 동기화
public static synchronized ThreadSafeSingleton getInstance() {
if (instance == null) {
instance = new ThreadSafeSingleton();
}
return instance;
}
}
3. 이중 체크 잠금(Double-Checked Locking)
public class DoubleCheckedLockingSingleton {
private static volatile DoubleCheckedLockingSingleton instance;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedLockingSingleton();
}
}
}
return instance;
}
}
4. 정적 내부 클래스 방식 (가장 권장)
public class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {}
private static class Holder {
private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance() {
return Holder.INSTANCE;
}
}
- JVM이 클래스 로딩 시점에 한 번만 초기화하므로 스레드 안전하고 성능도 우수합니다.
⚠️ 주의사항
- 테스트 시 단위 테스트 격리에 어려움이 생길 수 있음.
- 멀티스레드 환경에서는 스레드 안정성 확보 필요.
- 필요 이상의 전역 상태 사용을 유도할 수 있어 남용은 금물.
🤖 자주 사용하는 예
- Spring Framework의
@Component,@Service,@RepositoryBean 들은 기본적으로 싱글톤 스코프입니다. - DB Connection Pool, Configuration Manager 등에 자주 사용됩니다.