싱글턴 패턴(Singleton Pattern)은 객체가 딱 1개만 필요하고, 코드의 다양한 곳에서 접근해야 할 때 사용하는 디자인 패턴이다.
객체지향 프로그래밍의 객체는 빵틀로 찍어내듯 무한히 같은 객체를 생성하는 것이 장점이라고 했다. 하지만 상황에 따라서 객체가 중복되면 오히려 방해되고, 단 하나의 객체만 필요한 경우가 있다. 예를 들어 게임의 BGMManager 객체는 중복으로 생성되면 안 된다.
이처럼
- 공유 자원에 접근해야 하고
- 여러 코드가 하나의 자원에 접근하고
- 유일한 객체가 필요하거나
- 값이 캐시가 필요할 때
싱글턴 패턴을 사용한다.
구현
싱글턴 클래스는 객체가 1번 생성되어야 한다. 이 기능을 구현하기 위해 생성자를 private
으로 설정하고, 생성된 클래스가 없다면 생성을, 있다면 자기 자신을 반환하는 식으로 구현한다. 이러면 어디서 생성해도 같은 객체가 반환되어 전역적 접근이 가능하다.
class Singleton
{
private:
Singleton(); // 생성자
~Singleton(); // 소멸자
Singleton(const Singleton&); // 복사 생성자
Singleton& operator=(const Singleton&); // = 를 모두 private로
static Singleton* instance;
public:
static Singleton& getInstance()
{
if (Singleton.instance == nullptr)// 생성된 적이 없을 때만
{
Singleton.instance = new Singleton(); // 객체 생성
}
return Singleton.instance; // instance (자기 자신) 반환
}
};
C++11 이후부터는 static
을 사용해 다음과 같이 구현할 수도 있다.
class Singleton
{
private:
Singleton();
~Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
public:
static Singleton& getInstance()
{
static Singleton instance = new Singleton();
return instance;
}
};
장점
- 클래스는 반드시 하나의 인스턴스만 갖는다.
- 싱글턴 인스턴스는 다른 코드에서 전역 접근할 수 있다.
- 객체가 처음 요청될 때만 초기화되어서 효율적이다.
단점
- OOP의 주요 원칙인 단일 책임 원칙을 위반하긴 한다.
- 멀티 스레드 환경에서도 한 번만 생성되도록 보장하는 처리가 필요할 수 있다.
ex)static Singleton* instance; static std::mutex mutex_;...Singleton *Singleton::getInstance() { std::lock_guardmutex> lock(mutex_); if (instance == nullptr) { instance = new Singleton(); } return instance; } ...
반응형