어플리케이션을 개발하다 보면 어플리케이션 전역으로 쓰이는 필수 클래스가 있게 마련입니다. 이런 클래스들은 그 특성상 하나의 인스턴스만 생성되어야 하고, 시스템 전역에서 사용하다 보니 이 클래스의 코드 수정으로 인한 시스템에 걸쳐 있는 다른 프로그램들의 수정이 최소화되도록 설계되는 게 보통입니다.
하나의 인스턴스만 생성되어야 하는 클래스를 보통 싱글톤 클래스라고 부르는데요, 요즘은 패턴관련 책들이 워낙 많아 싱글톤 패턴들은 이미 머리 속에 콕 하고 들어 있을 겁니다.
싱글톤 클래스를 만드는 방법 중에 제가 자주(늘~) 사용하는 방법은 패턴 책에 구현된 코드가 아닌 “More Effective C++” 책에 소개된 방법입니다.
class Printer
{
public:
void SubmitPrint();
..
friend Printer& thePrinter();
private:
Printer();
...
};
Printer& thePrinter()
{
static Printer p;
return p;
}
// 호출
thePrinter().SubmitPrint();
책에서 소개된 방법은 짧고 아주 강력합니다.
1. Printer 클래스는 생성자가 private으로 선언되어 있습니다. 하나의 인스턴스만 만들어야 하기 때문에 아무나 이 클래스를 만들지 못하게 하기 위해 이와 같은 강력한 제한을 두는 거지요.
2. Factory 로 쓰이는 thePrinter() 함수는 Printer 의 friend 로 되어 있습니다. 즉 이 함수는 언제든 Printer 의 모든 멤버 함수에 접근할 길을 터 놓았습니다.
3. thePrinter () 구현 함수에서 Printer 를 static 으로 선언했습니다. 정적 객체로 만들어진 변수의 장점은 잘 아시다시피
A. 하나의 인스턴스만 생성된다는 것입니다.
B. 함수 thePrinter() 가 호출되기 전에는 Printer 가 만들어 질 일이 없습니다. 최소한 한번이라도 호출되어야 생성된다고 보장하는 셈입니다. 바로 이 점이 Printer 클래스를 단순히 전역으로 선언하는 것보다 훨씬 나은 방법이지요.
뭐 이 정도만으로도 아주 훌륭한 싱글톤 클래스라고 생각합니다. 여기서 조금 더 나아간다면
class Printer
의 헤더와 구현 부분을 실제 이 클래스를 사용하는 클라이언트와 완전히 분리하기 위해 interface IPrinter 와 같은 virtual 로만 이뤄진 인터페이스만 제공하는 방법이 있습니다. 이는 당연히 Printer 클래스의 수정으로부터 클라이언트를 보호해서 대규모 개발에 적합한 설계로 나아가기 위함입니다. 더 설명하지 않아도 잘 아실 테니 요건 Skip ^^;
사실 “More Effective C++” 책에는 이외에도 참 좋은 테크닉들이 많이 담겨 있습니다. 위 싱글톤 클래스는 단지 간단한 활용 예일 뿐이고요. 더 좋은 예들은 책을 구입해서 확인하시기 바랍니다.
More Effective C++ - 스콧 마이어스 지음, 곽용재 옮김/정보문화사 |
'개발 > C C++' 카테고리의 다른 글
[C++]소멸자에서 가상함수 호출하기 (8) | 2008.10.08 |
---|---|
[C++]포인터 Wrapping 클래스 만들기 (4) | 2008.09.09 |
[C/C++] enum, 보다 나은 enum (19) | 2008.07.21 |
[C++]STL Container 조합하기 (5) | 2007.11.12 |
[C/C++]유용한 #pragma directive (9) | 2007.09.05 |
[C++]인터페이스를 이용하여 상호참조와 종속성을 최소화하는 방법 (12) | 2007.07.15 |
댓글