728x90
반응형
싱글톤 패턴 (Singleton Pattern)
1. 싱글톤 패턴이란?
싱글톤 패턴은 클래스의 인스턴스를 단 하나만 생성하고, 어디서든 이 인스턴스에 접근할 수 있도록 하는 디자인 패턴입니다.
주로 다음과 같은 경우에 사용됩니다:
- 전역적으로 하나의 객체만 존재해야 하는 경우
- 객체 간의 공유 자원 관리가 필요한 경우
싱글톤 패턴의 구현 과정
1. 정적 변수를 선언
private static SingleTon instance;
- 클래스 내에 유일한 인스턴스를 저장하기 위해 static으로 선언합니다.
- 외부에서 직접 접근하지 못하도록 private 접근 제어자를 사용합니다.
2. 생성자를 private로 선언
private SingleTon() {}
- private 생성자를 선언하여 외부에서 new 키워드를 통해 인스턴스를 생성하지 못하도록 제한합니다.
3. 인스턴스 반환 메서드 제공
public static synchronized SingleTon getInstance() {
if (instance == null) {
instance = new SingleTon();
}
return instance;
}
- getInstance 메서드를 통해 인스턴스를 반환합니다.
- instance가 없을 경우에만 초기화하여 **Lazy Initialization (지연 초기화)**를 수행합니다.
- synchronized 키워드를 사용하여 멀티스레드 환경에서 안전하게 동작하도록 만듭니다.
싱글톤의 특징
- 인스턴스 유일성
- 클래스의 인스턴스가 단 하나만 존재합니다.
- 동일한 인스턴스를 전역적으로 접근 가능.
- Lazy Initialization
- 필요할 때 인스턴스를 생성하여 메모리를 효율적으로 사용.
- Thread Safety
- 멀티스레드 환경에서도 유일한 인스턴스를 보장하도록 구현.
- Global Access
- getInstance 메서드를 통해 프로그램 어디서든 동일한 인스턴스에 접근 가능합니다.
싱글톤 패턴의 장점과 단점
장점
- 메모리 절약: 유일한 인스턴스를 재사용하므로 메모리 낭비를 줄일 수 있습니다.
- 전역 상태 관리: 하나의 객체를 통해 상태를 관리할 수 있습니다.
- 캡슐화 강화: 외부에서 직접 인스턴스를 생성하지 못하므로 캡슐화가 강화됩니다.
단점
- 테스트 어려움: 전역 상태로 인해 단위 테스트 작성이 어렵습니다.
- 결합도 증가: 싱글톤 객체에 의존하는 코드가 많아질 경우 결합도가 증가할 수 있습니다.
- 멀티스레드 성능 저하: synchronized 키워드로 인해 동시성이 낮아질 수 있습니다.
멀티스레드 환경에서의 싱글톤 문제와 해결
문제: 동시 접근 시 인스턴스 생성 중복 가능성
멀티스레드 환경에서는 두 개 이상의 스레드가 동시에 getInstance 메서드를 호출할 경우, 두 스레드 모두 if (instance == null) 조건을 만족하여 인스턴스가 여러 개 생성될 위험이 있습니다.
해결: Thread Safety 보장
- synchronized 메서드
- getInstance 메서드에 synchronized를 사용하여 한 번에 하나의 스레드만 접근 가능하도록 설정.
public static synchronized SingleTon getInstance() {
if (instance == null) {
instance = new SingleTon();
}
return instance;
}
-
- 장점: 간단하고 구현하기 쉽습니다.
- 단점: 메서드 전체가 락을 걸기 때문에 성능 저하 가능.
- Double-Checked Locking
- synchronized를 최소화하기 위해 두 번의 체크를 수행합니다.
public static SingleTon getInstance() {
if (instance == null) {
synchronized (SingleTon.class) {
if (instance == null) {
instance = new SingleTon();
}
}
}
return instance;
}
-
- 장점: instance가 이미 생성된 경우 성능이 개선됩니다.
- 단점: 구현 복잡성 증가.
- 정적 초기화 (Eager Initialization)
- 클래스 로딩 시점에 인스턴스를 생성합니다.
private static final SingleTon instance = new SingleTon();
public static SingleTon getInstance() {
return instance;
}
-
- 장점: 간단하며 멀티스레드 환경에서도 안전.
- 단점: 초기화 시점에 메모리 사용.
- Enum을 사용한 싱글톤
- 자바의 Enum은 JVM에서 싱글톤을 보장하기 때문에 가장 안전하고 간단한 방식으로 평가받습니다.
public enum SingleTon {
INSTANCE;
public void someMethod() {
// 메서드 구현
}
}
-
- 장점: 직렬화와 멀티스레드 안전성이 자동으로 보장됩니다.
- 단점: Enum이 싱글톤을 표현하는 데는 지나치게 단순하다는 비판.
싱글톤의 활용 사례
- 데이터베이스 연결 관리
- 하나의 연결 객체를 재사용하여 관리.
- 캐싱
- 특정 데이터를 전역적으로 저장하고 활용.
- 로그 관리
- 애플리케이션 전체에서 동일한 로그 객체 사용.
- 설정 관리
- 전역 설정 값을 관리하는 객체.
728x90
반응형
'Java&Spring' 카테고리의 다른 글
[디자인패턴] Adaptor (0) | 2025.01.09 |
---|---|
[ 디자인패턴 ] 콜백 메서드 직접 만들어 보기 (0) | 2025.01.09 |
[ 디자인패턴 ] 디자인 패턴이란? (0) | 2025.01.09 |
댓글