본문 바로가기

4.개발 및 운영 환경

Singleton

출처 : http://ninvu.egloos.com/1469576

회사 모~대리가 쓴거...베낌..
----------------------------------------------------------
싱글톤 참 유용하게 쓰이는 클래스 입니다.
전역 변수를 두지 않고 어디서나 호출해서 쓸 수 있고 전역 변수와 달리 필요할 때 초기화 되는 잇점이 있죠.
뭐 잇점이야 말씀 안드려도 잘 아시겠지만 보통 이렇게 쓰죠?

template <class T>
class CSingleton
{
public:
   class CSingletonRelease
   {
   public:
       ~CSingletonRelease() { T::destory(); }
   };

   static T* instance()
   {
       if (NULL == _inst) _inst = new T;
       return _inst;
   }

   static destory()
   {
       if (_inst) delete _inst;
       _inst = NULL;
   }

private:
   static T* _inst;
};

template <class T>
T* CSingleton<T>::_inst = NULL;

// 특정 클래스
class Examp : public CSingleton<Examp>
{
}

CSingleton<Examp>::CSingletonRelease singletonRelease;

new 를 사용하기 때문에 어쩔수 없이 CSingletonRelease 라는 불필요한 클래스가 생겨났습니다. 그리고 destroy() 라는 함수도 생겼네요.
이걸 해결해 주는 멋진 idea가 있습니다.

class Examp
{
   Examp& instance() {
       static Examp _inst;
       return _inst;
   }
}

위 함수 하나면 위 Singleton 클래스의 모든 기능을 할 수 있습니다.
테스트해본 결과 instance 를 최초 호출할 때 인스턴스가 생겼습니다.
결과적으로 똑같죠.
코드도 간단하죠.
귀찮게 헤더파일 찾아서 인클루드하고 상속받지 않아도
함수 항개만 넣으면 되죵.
귀찮게라도 소스를 공유하고 싶으시다면

template <class T>
class CSingleton
{
public:
   static T& instance()
   {
       static T _inst;
       return _inst;
   }
};

간단하네요 ㅡㅡ;;

참고 : http://younghoe.info/168

Singleton Pattern

컨텍스트

클래스가 단 하나의 인스턴스만을 갖도록 유일한 접근 지점을 제공한다. 중요한 자원에 대한 관리를 하는 클래스의 경우는 유일한 인스턴스의 존재를 보장해야 한다. 가령, 데이터베이스 커넥션과 같이 시스템의 소중한 자원을 관리하는 객체의 경우 다수의 객체가 커넥션을 할당하고, 해제한다면 효과적인 관리가 어려워진다. 이와 같이 시스템에 유일하게 존재하는 것을 보증할 때 사용하는 패턴이 Singleton 패턴이다.

실생활에서 한 나라의 대통령은 특정 시점에 대해서 한 사람만이 존재하기 마련이다. 중요한 의사결정을 함에 있어서 여러 명의 대통령이 각자의 의사결정을 별도로 수행한다면 곤란하지 않은가? 이러한 사례는 Singleton의 필요성을 유추하는데 개념적인 수준에서의 도움이 될 수 있다.

적용 영역

  • 특정 클래스에 대해 클라이언트에게 잘 알려진 유일한 인스턴스가 요구될 때
  • 클라이언트가 특정 클래스의 유일한 인스턴스의 수정 없이 이를 상속한 클래스의 인스턴스를 사용할 때

구조

적용 결과

  • Singleton 클래스는 유일한 인스턴스를 캡슐화한다. 이로써 인스턴스에 대한 접근 방법과 접근 시점에 대한 통제가 가능하다
  • Singleton은 전역 변수(Global variable)에 대한 개선책이다. Singleton을 사용하면 전역 변수 사용시에 발생할 수 있는 네임스페이스 충돌1 을 막을 수 있다. 즉, 네임 스페이스 낭비를 막는다.
  • 상속을 통해 구조나 행위들을 수정할 수 있다.
  • 유일한 인스턴스의 사용 대신에 특정한 숫자의 인스턴스를 사용하도록 수정이 가능하다.
  • 언어에 따라 제약 사항을 갖게 되는 클래스 오퍼레이션(class operation)보다 유연성을 갖는다. 가령, Singleton은 하나 이상의 인스턴스 생성이 가능하다.
  • 자바에서 정적 메소드(static method)를 갖는 클래스와 Singleton 클래스를 비교하면, Singleton을 사용하는 경우 명확한 객체 지향 설계가 가능한 반면, 정적 메소드를 사용하는 클래스는 단순한 기능 목록이 될 우려가 있다.
  • 복수의 VM이 사용되는 경우 각각의 VM마다 Singleton 인스턴스가 생성되기 때문에 분산 어플리케이션은 이를 유의해야 한다.
  • 복수의 클래스 로더가 쓰이는 경우 동일한 이름을 갖는 각각의 Singleton 인스턴스가 생성되기 때문에 네임스페이스를 구분해야 한다.
  • 참조되지 않는 Singleton 인스턴스는 가비지 콜렉션(garbage collection)에 의해서 파괴되고, 재생성 될 수 있다. 이때는 새롭게 초기화가 수행되는 점을 유의해야 한다.

관련 패턴

  • Abstract Factory, Builder 및 Prototype을 비롯해서 많은 패턴이 Singleton과 병행해서 사용될 수 있다.

참고 문헌

[1] 온라인
[2] 위키 피디아: Singleton pattern
[3] 충북대 번역글: The Singleton Factory Pattern
[4] 자바월드 아티클:
Singletons Rule
[5] When is a singleton not a singleton

서적 안내

Design Patterns: Elements of Reusable Object-Oriented Software

Head First Design Patterns
에릭 프리먼 외 지음,
서환수 옮김
한빛미디어
GOF의 디자인 패턴
Erich Gamma 외 지음,
김정아 옮김
피어슨에듀케이션코리아
반응형