싱글톤 패턴
하나의 인스턴스만 생성하고, 이 인스턴스를 전역적으로 접근 가능하게 만들어 사용하는 디자인 패턴
특징
- 인스턴스가 하나만 존재 : 애플리케이션 전체에서 동일한 인스턴스를 사용
- 글로벌 접근 : 전역적으로 동일한 객체에 접근할 수 있음
- 생성 제한 : 외부에서 직접 객체를 생성하지 못하도록 제한
장점
- 전역 상태 관리 : 하나의 객체를 공유하여 상태를 일관되게 유지할 수 있음
- 리소스 절약 : 하나의 객체만 생성되므로 메모리와 자원을 절약할 수 있음
- 글로벌 접근 : 애플리케이션 전역에서 동일한 인스턴스에 접근이 가능
단점
- 글로벌 상태 관리 문제 : 잘못 사용하면 프로그램이 불필요하게 복잡해질 수 있음
- 멀티스레드 환경에서의 문제 : 올바르게 구현되지 않으면 Thread-safe를 보장하지 못할 수 있음
- 테스트 어려움 : 객체를 하나만 생성하기 떄문에 테스트 시 Mock 객체를 활용하기 어려움
public class Singleton {
private static Singleton instance;
// private 생성자: 외부에서 객체 생성 방지
private Singleton() {}
// 전역 접근 메서드
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
// 사용
public class Main {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // 출력: true
}
}
자바에서 싱글톤을 구현하는 6가지 방법
- Eager Initialization (즉시 초기화)
- Lazy Initialization (지연 초기화)
- Synchronized Method
- Double-Checked Locking
- Static Inner Class
- Enum
1. Eager Initialization (즉시 초기화)
클래스가 로드될 때 인스턴스를 생성한다.
- 장점: 구현이 간단하며 Thread-Safe를 보장한다.
- 단점: 인스턴스가 필요하지 않아도 생성된다.
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
2. Lazy Initialization (지연 초기화)
인스턴스를 필요할 때 생성한다.
- 장점 : 필요할 때만 인스턴스를 생성하여 메모리 낭비를 방지한다.
- 단점 : 멀티스레드 환경에서 안전하지 않다.
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. Synchronized Method
Thread-Safe를 보장하기 위해 메서드에 synchronized 키워드를 사용한다.
- 장점: Thread-Safe를 보장한다.
- 단점: 메서드 호출 시 동기화로 인해 성능이 저하될 수 있다.
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4. Double-Checked Locking
Thread-Safe를 보장하면서 성능 저하를 최소화한다.
- 장점: Thread-Safe와 성능을 모두 보장한다.
- 단점: 구현이 약간 복잡하다.
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;
}
}
5. Static Inner Class
클래스가 로드될 때 인스턴스를 생성하지 않고, 호출 시점에 생성한다.
- 장점: Lazy Initialization과 Thread-Safe를 동시에 보장한다.
- 단점: 특별한 단점이 없으며, 가장 권장되는 방식 중 하나
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
6. Enum
싱글톤 패턴을 구현하는 가장 간단하고 안전한 방법
- 장점: Thread-Safe를 보장하며 구현이 간단하고, 직렬화와 리플렉션에 대해 안전하다.
- 리플렉션 ? = 실행 시간에 클래스, 메소드, 필드 등의 정보를 동적으로 탐색하고 조작할 수 있는 기능
- 단점: Enum을 사용해야 하므로 제한적인 상황에서는 적합하지 않을 수 있다.
public enum Singleton {
INSTANCE;
public void someMethod() {
System.out.println("Singleton using Enum");
}
}
728x90
'CS' 카테고리의 다른 글
Layered 패턴 (2) | 2025.01.08 |
---|---|
MVC 패턴 (0) | 2025.01.08 |
모니터링 환경 구성 (Prometheus, Grafana) / Grafana Dashboard 설정 (0) | 2024.12.06 |
[네트워크] TCP, UDP 프로토콜 / 3 Way Handshake (0) | 2024.12.02 |
[CS] 컴파일 언어 vs 인터프리터 언어 / 자바 / 자바 환경변수 설정 (0) | 2024.12.02 |