본문 바로가기
카테고리 없음

싱글톤 패턴

by ByteBridge 2013. 3. 12.
반응형


출처: http://blog.naver.com/enros?Redirect=Log&logNo=10153903701


싱글톤이란?

 

하나의 프로그램내에서 n개의 인스턴트를 만들고,

어디서든지 그 인스턴스에 접근 할 수 있도록 만든 패턴.

 

객체를 메모리에 한번만 올려 사용하는 패턴으로 클래스에 하나만 존재하고 주로 매니저 급,

관리자 클래스에서 사용하고 관리자로써 필요한 것들만 매니저로 만들어서 사용.

★싱글톤은 많이 사용하면 스파게리 소스가 되어 문제가 될 수 있다.

 

클래스의 공용으로 쓰이는 것이므로 남발 할 수 없고,

메모리 관리자를 쓰게되면 할당 할 때마다 포인터를 할당하는 스마트 포인터가 된다.

 

싱글톤은 객체를 하나만 만드는 것을 목표로 하고, 어떤 객체를 관리 용도로 사용.

static을 클래스에 넣으면 반드시 전역에서 초기화 해줘야 하고 클래스 전역에서 사용한다.

생성자 소멸자를 private로 바꿔 다른 클래스에서 생성자를 호출하지 못하게 한다.

 

멤버함수에서 할당 된 메모리를 해제 할 Destroy함수를 만들고,

해당 클래스를 사용한 후에는 반드시 Destroy함수를 호출 하여 메모리를 해제 해 주어야 한다.

 

static의 멤버변수와 멤버함수를 만들고 이름은 Instance, 객체가 메모리 공간안에,

잡혔다는 걸 표현하기 위해,

멤버변수는 동적할당을 위한 포인터 역할을 하며,

멤버함수는 함수가 소속된 클래스를 객체화 하는 일을 한다. 

 

외부에서 값을 변경하면 마지막에 변경한 값이 싱글톤을 사용하는 모든 프로젝트에서 모두 적용된다.

음..그니깐 아무 클래스에서 싱글톤 클래스를 불러와 값을 변경하면 그냥 바뀐다!!

static은 외부에서 바꾼 값을 넘길 때 계속 저장되어 있다.

 

보통 클래스를 객체화 할 때! 

포인터를 선언한 후 new라는 키워드를 통해 생성, 

이럴경우 클래스의 인스턴스가 동적할당 되었기 때문에 Heap영역에 올라가고, 

그 인스턴스를 가리키는 변수는 Stack영역에 생기게 된다. 

객체를 Heap영역에 올리는 작업자체가 오래 걸리는 일이기 때문에,

자주 사용되는 객체, 혹은 어떠한 작업을 관리하는 매니저 같은 객체를 생성 할 때는,

한번만 생성(Heap영역에 한번만 올린다)하면 Stack에서 같은 객체를 가리키게 한다.

 

싱글톤을 사용하면 객체가 Heap영역에 할당 될 때, 시간과 메모리를 줄일 수 있다.

 

 

싱글톤은 일반 멤버 변수가 있을 때 사용하는 것이다.

 

 

class CSingleton
{
private:
 static CSingleton* m_pInstance; //객체화 시켜서 메모리를 할당 시킴. static 변수는 컴파일 시 메모리 할당.
public:
 static CSingleton* GetInstance(void)
 {
  if(m_pInstance == NULL)
  {
   m_pInstance = new CSingleton;
  }
   return m_pInstance;
 }
 void DestroyInstance(void)
 {

   if(m_pInstance)

   {
      delete m_pInstance ;
      m_pInstance = NULL;

    }
 }
private:
 CSingleton(void);

public:
 ~CSingleton(void);
};

 

CSingleton* CSingleton::GetInstance = NULL;

// :: 는 오로지 스테이틱함수를 호출 하는 방식!

반응형