싱글톤 패턴 (Singleton Pattern)
반복되는 인스턴스 낭비를 줄이자
2020/02/23
참고자료
1. Intro
특정 클래스의 인스턴스가 단 하나만 존재해야 하는 경우에 싱글톤 패턴을 사용합니다.
싱글톤 패턴은, 반복적인 디자인 문제를 해결하는 방법을 설명하는 책인 Design Patterns의 23가지 디자인 패턴 중 하나입니다.
이 책에서는 반복되는 디자인 문제를 어떻게 유연하고 재사용 가능하도록 디자인하는지 서술하고 있습니다.
싱글톤 패턴은, 클래스의 인스턴스를 시스템 내에 단 한개만 존재하도록 제한시키는 소프트웨어 디자인 패턴입니다. 시스템 전체에서 작업을 조정하는 데 정확히 하나의 개체가 필요한 경우에 유용합니다.
2. Problem
싱글톤 패턴은 다음과 같은 문제를 해결할 수 있습니다.
- 클래스의 인스턴스를 단 하나만 생성하고 싶은 경우, 이것을 어떻게 보장할 수 있는가?
- 클래스의 단일 인스턴스에 쉽게 접근할 수 있는 방법은 무엇일까?
- 클래스는 인스턴스화를 어떻게 제어할 수 있는가?
- 어떻게 클래스의 인스턴스 수를 제한할 수 있는가?
3. Solve
싱글톤 패턴은 위의 문제를 다음과 같이 해결합니다.
- 클래스의 생성자(constructor)를 숨긴다.
- getInstance()라는 public static 함수를 만들어, 단일 인스턴스를 반환하도록 한다.
이 패턴의 핵심 아이디어는 클래스 자체가 인스턴스화 제어 (한 번만 인스턴스화 됨)를 책임지게 하는 것입니다. 숨겨진 생성자(private)는 클래스 외부에서 인스턴스를 생성할 수 없다는 것을 증명합니다. 클래스 이름과 작업 이름 (Singleton.getInstance())을 사용하여 쉽게 액세스 할 수 있습니다.
4. Examples
Typescript
class Singleton {
private static _default: Singleton;
static getInstance(): Singleton {
if (!Singleton._default) {
Singleton._default = new Singleton();
}
return Singleton._default;
}
}
Java
public final class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
5. Lazy initialization
싱글톤 인스턴스가 멀티스레드 환경에서 동시에 호출된다면, 두개 이상의 인스턴스가 생성될 수 있습니다.
아래의 예시는 이를 방지하기 위한 thread-safe 샘플코드입니다. double-checked locking을 사용합니다.
Java
public final class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}