본문 바로가기
개발/C C++

싱글톤 클래스

by esstory 2008. 7. 1.

 

어플리케이션을 개발하다 보면 어플리케이션 전역으로 쓰이는 필수 클래스가 있게 마련입니다. 이런 클래스들은 그 특성상 하나의 인스턴스만 생성되어야 하고, 시스템 전역에서 사용하다 보니 이 클래스의 코드 수정으로 인한 시스템에 걸쳐 있는 다른 프로그램들의 수정이 최소화되도록 설계되는 게 보통입니다.

 

하나의 인스턴스만 생성되어야 하는 클래스를 보통 싱글톤 클래스라고 부르는데요, 요즘은 패턴관련 책들이 워낙 많아 싱글톤 패턴들은 이미 머리 속에 콕 하고 들어 있을 겁니다.

 

싱글톤 클래스를 만드는 방법 중에 제가 자주(늘~) 사용하는 방법은 패턴 책에 구현된 코드가 아닌 “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++ - 10점
스콧 마이어스 지음, 곽용재 옮김/정보문화사


댓글