Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 싱글톤(Singleton) 디자인 패턴 완벽 가이드

싱글톤(Singleton) 디자인 패턴은 클래스의 인스턴스 생성을 단 하나의 객체로 제한하는 소프트웨어 설계 원칙입니다. 시스템 전반에서 정확히 하나의 객체만 존재해야 할 때 매우 유용합니다.

대표적인 활용 사례로는 파일에 로그를 기록하는 로거(logger)가 있습니다. 로거를 싱글톤 클래스로 구현하면 프로그램 어디서든 동일한 인스턴스에 접근할 수 있어, 여러 모듈이 일관성 있게 로그를 남길 수 있습니다.

C++ 싱글톤 구현 예제

다음 코드는 C++에서 싱글톤 클래스를 구현하는 기본적인 방법을 보여줍니다.

#include <iostream>

using namespace std;

class Singleton {
    static Singleton *instance;
    int data;

    // 외부에서 객체를 생성하지 못하도록 private 생성자 선언
    Singleton() {
        data = 0;
    }

    public:
    static Singleton *getInstance() {
        if (!instance)
            instance = new Singleton;
        return instance;
    }

    int getData() {
        return this->data;
    }

    void setData(int data) {
        this->data = data;
    }
};

// 첫 번째 getInstance() 호출 시 초기화될 수 있도록 포인터를 0으로 초기화
Singleton *Singleton::instance = 0;

int main(){
    Singleton *s = s->getInstance();
    cout << s->getData() << endl;
    s->setData(100);
    cout << s->getData() << endl;
    return 0;
}

핵심 포인트 정리

  • private 생성자: 생성자를 private으로 선언해 외부에서 new 키워드로 객체를 직접 생성하는 것을 차단합니다.
  • static 멤버 변수: 클래스 자체가 유일한 인스턴스를 저장하며, 모든 객체가 이 포인터를 공유합니다.
  • getInstance() 메서드: 최초 호출 시 인스턴스를 생성하고, 이후 호출에는 항상 같은 인스턴스를 반환합니다.

실행 결과

위 코드를 실행하면 다음과 같은 출력을 얻습니다.

0
100

처음 getData() 호출 시 생성자에서 초기화된 값 0이 출력되고, setData(100) 호출 후에는 변경된 값 100이 출력됩니다. 이는 getInstance()를 통해 얻은 객체가 항상 동일한 단일 인스턴스임을 보여줍니다.

주의 사항

위 예제는 단일 스레드 환경을 가정한 기본 구현입니다. 멀티스레드 환경에서는 여러 스레드가 동시에 getInstance()를 호출할 경우 인스턴스가 중복 생성될 수 있으므로, 뮤텍스(mutex)를 활용한 동기화 처리나 C++11 이상의 지역 static 변수를 이용한 스레드 안전(thread-safe) 구현을 고려하는 것이 좋습니다.