싱글톤( 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의 할당 여부를 확인하는 코드가 필요합니다.




+ Recent posts