정적 멤버 변수는 클래스에 속하지만 객체별로 할당되지 않고 모든 객체가 공유하는 멤버이다. 개별 객체와는 직접적 상관이 없고 객체 전체를 대표하는 클래스와 관련된 정보를 저장하는 특수한 멤버이다. 싱글톤 패턴은 애플리케이션이 시작할 때 해당 클래스 타입의 정적 멤버 포인터 변수를 통해 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 쉽게 말하자면 객체를 단 하나만 만들 수 있는 것이다.
#define DECLARE_SINGLE(Type) \
private:\
static Type* m_pInst;\
public:\
static Type* GetInst()\
{\
if(!m_pInst)\
m_pInst = new Type;\
return m_pInst;\
}\
static void DestroyInst()\
{\
SAFE_DELETE(m_pInst);\
}\
private:\
Type();\
~Type();
위 코드는 싱글톤 패턴에 대해 정의한 매크로 함수이다. 정적 멤버 포인터 변수 m_pInst를 선언하고 GetInst 정적 멤버 함수는 m_pInst가 NULL포인터일때만 메모리를 할당한다. 그리고 DestroyInst로 메모리를 해제한다. 하지만 static Type* m_pInst; 선언은 Type 클래스의 멤버라는 것을 알릴 뿐이지 메모리를 할당하지 않는다. 그래서 외부에서 별도로 선언 및 초기화 함으로써 메모리를 할당해야 한다.
#define DEFINITION_SINGLE(Type) Type* Type::m_pInst = NULL;
그래서 정적 멤버 변수를 외부에서 선언 및 초기화하는 매크로 함수도 생성한다. 내가 실습중인 WinAPI에서는 싱글톤 패턴을 만들 클래스의 헤더파일 내부에 DECLARE_SINGLE을 작성하고 구현파일(cpp)에 DEFINITION_SINGLE을 작성했다.

싱글톤 패턴을 쓰는 이유는 한개의 인스턴스만 생성하기 때문에 메모리 낭비를 방지할 수 있고 해당 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터에 접근하기 쉽다. 하지만 접근이 쉬워지기 때문에 그만큼 다른 클래스의 인스턴스와 결합도가 높아져 객체 지향 원칙(캡슐화 등)을 위배할 수 있으니 남용하는 것은 좋지 않다. WinAPI 실습중에서는 인스턴스를 한개만 생성해도 되는 관리자(xxxManager) 클래스에 사용하였다.
'C++' 카테고리의 다른 글
| [C++] 상속관계에서 복사 생성자 호출 (0) | 2022.01.18 |
|---|---|
| [C++] const string&을 쓰는 이유(const와 레퍼런스) (0) | 2022.01.18 |
| [C++] 맵(map) (0) | 2022.01.11 |
| [C++] 셋(set) (0) | 2022.01.11 |
| [C++] 반복자 (0) | 2022.01.10 |