본문 바로가기

Programming/C&C++

C++ 싱글톤 패턴

출처 : http://egloos.zum.com/Lansi/v/4165048


싱글톤 패턴이란 인스턴스 생성을 단 하나만 생성하도록 제한하는 패턴을 말합니다.

인스턴스를 하나밖에 생성을 못 한다면 클래스가 무용지물이 될 수 있다고 생각할 수도 있습니다.

싱글톤 패턴은 나름대로 사용해야 할 곳이 있고, 장점이 있기 때문에 많이 쓰이고 있습니다.

예를들어, 데이터 관리 클래스가 있다고 할 때 그 데이터를 여러 클래스에서 써야하는데

데이터를 모두 공용으로 써야할 때 쓰입니다.


원리는 포인터를 하나 선언해주고 포인터가 NULL일 때 정적으로 인스턴스를 한 번만 생성해줍니다.

그리고 그걸 포인터에 넣어놓고 리턴 해주는 겁니다.

그 리턴값으로 정적으로 생성된 단 하나의 인스턴스에 접근해 사용하는거죠.


중요한 점은 정적으로 선언해야한다는 것과, 다른 클래스에서 생성자에 접근하지 못하게

private로 해줘야 된다는 것입니다.

CSingleton.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma once
 
class CSingleton
{
private:
    static CSingleton* pInstance; //정적 포인터 변수
    CSingleton() {} //생성자는 꼭 private나 protected로
    ~CSingleton() {}
 
public:
    static CSingleton* GetInstance() //포인터 값을 리턴해주는 함수
    {
        if (NULL == pInstance) //포인터가 NULL일 경우
        {
            pInstance = new CSingleton(); //힙 영역에 동적 할당 후 포인터에 저장
        }
 
        return pInstance; //포인터 리턴
    }
 
    static void FreeInstance() //메모리 해제
    {
        if (NULL != pInstance) //포인터가 비어있지 않다면
        {
            delete pInstance; //메모리 해제
            pInstance = NULL;
        }
    }
};
 
CSingleton* CSingleton::pInstance = NULL//클래스 밖에서 초기화
 
cs

싱글톤 클래스 예제입니다. CPP에 함수들을 따로 정의하면 오류가 납니다.

아래는 사용 방법입니다.

CTest.h

1
2
3
4
5
6
7
class CSingleton; //싱글톤 클래스의 프로토 타입
 
class CTest
{
private:
    CSingleton *m_pSingleton; //포인터를 따로 저장해둘 변수
};
cs

데이터를 사용할 클래스의 헤더입니다.

여기서 중요한 점은 헤더에 싱글톤 클래스를 인클루드하면

중복 정의로 오류가 납니다.

CTest.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "CTest.h"
#include "CSingleton.h" //CPP 파일에 인클루드
 
CTest::CTest()
{
    m_pSingleton = CSingleton::GetInstance(); //멤버 변수에 포인터에 따로 받아둡니다.
}
 
CTest::~CTest()
{
    m_pSingleton->FreeInstance(); //종료시에는 메모리 해제
    m_pSingleton = NULL;
}
cs

CPP 파일입니다. 여기다 싱글톤 클래스를 인클루드 해주면 오류가 나지 않습니다.

사용할 땐 m_pSingleton->멤버 함수() 이런 식으로 사용하면 되겠죠?


이렇게 만들어주시면 하나의 데이터를 여러 클래스가 공유하며 사용할 수 있게 됩니다.