본문 바로가기

C++

[C++] static 멤버와 싱글톤 패턴

정적 멤버 변수는 클래스에 속하지만 객체별로 할당되지 않고 모든 객체가 공유하는 멤버이다. 개별 객체와는 직접적 상관이 없고 객체 전체를 대표하는 클래스와 관련된 정보를 저장하는 특수한 멤버이다. 싱글톤 패턴은 애플리케이션이 시작할 때 해당 클래스 타입의 정적 멤버 포인터 변수를 통해 최초 한번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 쉽게 말하자면 객체를 단 하나만 만들 수 있는 것이다.

 

#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