싱글톤( Singleton ) 패턴이란?
- 싱글톤( Singleton ) 패턴은 오직 하나의 인스턴스만을 생성하여 사용하기 위한 목적으로 사용되는 디자인 패턴입니다.
- 특히 싱글톤 패턴은 파일 시스템이나 오브젝트들을 관리하는 매니저 인스턴스와 같이 오직 1개의 인스턴스만 필요로 하는 상황에 적합합니다.
싱글톤 패턴의 장.단점
장점
- 하나의 인스턴스만을 생성해야 하는 클래스의 추가적인 인스턴스 생성을 방지할 수 있습니다.
단점
- 어디서든 접근할 수 있기 때문에 멀티 쓰레드 환경에서는 동기화 문제를 신경써야 됩니다.
- 여러 코드에서 싱글톤 패턴을 사용한 인스턴스를 참조할 경우 의존성이 높아져 추후 디버깅에 어려움이 있을 수 있습니다.
싱글톤 패턴 사용법 두 가지
static 인스턴스를 이용한 싱글톤 패턴
class CSingleton
{
public:
static CSingleton* GetInstance()
{
static CSingleton obj;
return &obj;
}
void ShowMe()
{
std::cout << "Hello World\n";
}
private:
CSingleton(){}
~CSingleton() = default;
};
int main()
{
CSingleton::GetInstance()->ShowMe();
return 0;
}
- 정적 할당을 통한 싱글톤 패턴은 프로그램 시작과 동시에 전역 CSingleton 인스턴스의 메모리가 확보됩니다.( 생성자는 인스턴스가 선언된 코드를 만나면 호출됩니다. )
- 동적 할당을 통한 싱글톤 패턴 보다는 편리하다는 장점이 있지만 사용하지 않았을 때도 인스턴스에 대한 메모리가 프로그램이 실행됨과 동시에 확보된다는 메모리 낭비에 대한 단점이 있습니다.
동적 할당을 통한 싱글톤 패턴
class CSingleton
{
public:
static CSingleton* GetInstance()
{
mMutex.lock();
if (mpInstance == nullptr) {
mpInstance = new CSingleton();
}
mMutex.unlock();
return mpInstance;
}
void ShowMe()
{
std::cout << "Hello World\n";
}
private:
CSingleton(){}
~CSingleton() = default;
static std::mutex mMutex;
static CSingleton *mpInstance;
};
std::mutex CSingleton::mMutex;
CSingleton* CSingleton::mpInstance = nullptr;
- 동적 할당 방식은 인스턴스를 동적할당 받는 코드를 만나기 전까지는 인스턴스가 생성되지 않습니다. 그렇기 때문에 사용하지 않을 경우 인스턴스가 생성되지 않기 때문에 메모리가 낭비되지 않습니다.
- 동적 할당 방식은 정적 할당 방식처럼 Thread Safe 하지 않기 위 코드와 같이 동기화 객체를 이용해서 mpInstance의 할당 여부를 확인하는 코드가 필요합니다.