싱글톤 패턴이란?
싱글톤 패턴은 특정 클래스의 인스턴스를 하나만 생성하도록 보장하는 패턴으로, 주로 공유 자원이나 설정 정보를 다룰 때, 혹은 인스턴스가 여러 개 생기면 안 되는 경우에 사용됩니다.
전체 시스템에서 하나의 객체를 통해 동일한 데이터를 공유하거나 특정 작업을 수행할 수 있습니다.
● 싱글톤 패턴 구현방법
1. Eager Initialization (즉시 초기화)
애플리케이션이 시작될 때 인스턴스를 미리 생성해 두는 방식입니다.
가장 간단한 하고 스레드 안전성이 보장이 되지만 클래스가 로드될 때 인스턴스를 바로 생성해 사용하지 않아도 메모리를 차지할 수 있습니다.
public class Singleton {
// static으로 미리 객체 생성
private static final Singleton instance = new Singleton();
// 생성자를 private으로 제한하여 외부에서 생성하지 못하도록 함
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. Thread Safe Singleton (스레드 안전 싱글톤)
Lazy Initialization(지연 초기화)를 멀티스레드 환경에서도 안전하게 사용하도록 synchronized 키워드를 추가하여 스레드 안전성을 보장하지만 성능 저하 가능성이 있습니다.
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 (이중 검사 잠금)
멀티스레드 환경에서 성능 문제를 해결한 방식입니다. 인스턴스가 이미 생성되었는지 확인하는 두 번의 검사를 통해 불필요한 synchronized 사용을 줄입니다.
public class Singleton {
private static volatile Singleton instance; //volatile - Java 변수를 Main Memory에 저장하겠다라는 것을 명시
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
5. Bill Pugh Singleton (정적 내부 클래스 사용)
정적 내부 클래스에 인스턴스를 생성하는 방식으로, 클래스 로드 시점까지 인스턴스 생성을 지연시키며, 멀티스레드 환경에서도 안전합니다.
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 Singleton
enum을 사용하여 싱글톤을 구현하는 방식입니다. 자바의 enum은 기본적으로 인스턴스가 하나만 생성되므로, 싱글톤을 구현할 때 가장 안전하고 간단한 방법 중 하나입니다.
public enum Singleton {
INSTANCE;
public void someMethod() {
// 메서드 구현
}
}
싱글톤 패턴은 Bill Pugh Solution기법이나 Enum으로 만들어 사용하면 안전하게 사용할 수 있습니다.