싱글톤(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) 구현을 고려하는 것이 좋습니다.