Programming Languange/디자인 패턴

디자인 패턴 (Design Patterns) - 싱글턴 패턴

타자치는 문돌이 2024. 4. 9. 17:16

싱글턴 패턴(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;
    }
    ...

 

디자인 패턴 (Design Patterns) - Index