본문 바로가기
WinAPI 32

06 WinAPI) Singleton

by Dev_Hugh 2023. 11. 12.
728x90
반응형

오늘은 Singleton 패턴에 대해 배우려고 한다. Unity에서 Singleton을 자주 다뤘지만 막상 C++로 하려니 조금 낯선느낌ㅋㅋ

이 또한 GitHub에 코드로 올라가 있으니 Core 폴더 내부의 CCore.h 파일을 확인하자

https://github.com/JinHyung16/WinApi

 

GitHub - JinHyung16/WinApi

Contribute to JinHyung16/WinApi development by creating an account on GitHub.

github.com


우리가 객체 생성을 하여 사용할 때 오로지 1개의 객체만을 갖도록 보장하고 싶을  때 사용한다. 이해를 위해 Step을 나눠가며 하나씩 코드로 작성하고자 한다. 먼저 동적 할당 방법으로 만들어보자.

 

Step 1) 객체를 1개만 생성할 수 있게 보장하기 위해선 우선 Class를 객체로 만들 때 생성자와 소멸자에 대해 생각하자. 이 생성자와 소멸자를 private로 가리면 외부에서 막 Instance하는걸 막을 수 있을 것이다. 

생성자와 소멸자 private으로 가리기

 

Step 2) Class A 내부의 public 영역의 멤버에 접근하고 싶을 때 객체 생성을 하고 접근해야 하는데 이렇게 막으면 안된다. 그렇다면 이를 가능하게 하는것은? static이다. 왜냐면 this 키워드로 호출하는 형식이 아니기 때문이다.

static 함수 생성

Step 3) 이제 인스턴스화를 하지 않고도 해당 Class내 함수 접근이 가능하다. Get과 Delte를 담당하는 함수를 만들었다. 여기서 static에 대해 알아야 하는데 static은 데이터 영역에 생성된다.

즉 static을 [멤버 함수 내부에 선언시] [클래스 내 데이터 멤버(멤버 변수 의미)로 선언시] [파일 내 선언시 (.cpp내 선언 의미)] 결국 데이터 영역에 위치한다. 함수 내부 선언시엔 함수의 종료와 상관없이 멤버 함수의 대한 데이터는 프로그램 종료까지 남아있게 된다.

 

만약 누군가 CCore의 GetInstace() -> Release() -> GetInstance() 이렇게 호출하면 어떤일이 생길까? Release에서 core 객체를 받아 파괴했다. 그러나 GetInstance함수 내 static core는 파괴된 객체의 주소를 가리키고 있어 문제가 생긴다.

그래서 이를 수정하려면 GetInstance와 Release 둘 다 접근 가능하게 클래스 내 정적 멤버로 선언해야 한다.

CCore.cpp에서 static core를 nullptr로 초기화하면 된다.

최종 Singleton 패턴

 

이제 싱글톤 패턴까지 공부했으면 CCore를 통해 게임의 핵심 로직을 처리하는 코드를 만들면서 점점 게임을 만들어 갈것이다. 참고로 이런 형식으로 코드를 변경하면 이는 동적 생성이아닌 다른 방식으로 데이터 영역에 싱글톤 패턴을 만드는 방식이다.   

class CCore
{
private:
  static CCore* core;
public:
  static CCore* GetInstance()
  {
  	core = new CCore;
    return &core;
  }
};

그럼 이 방식과 동적 방식의 차이가 무엇이냐? 바로 메모리 해제에 관련한 차이다. 동적 방식은 내가 메모리 해제에 대해 고민하지만 이 방식은 그럴필요가 없다. 프로그램이 종룔된다면 메모리는 자동으로 해제될테니 (따라서 무겁지 않으면서 프로그램 처음부터 끝까지 메모리에 있어야 하는경우 이 방식을 사용하자) 

728x90
반응형

'WinAPI 32' 카테고리의 다른 글

08 WinAPI) Timer  (0) 2023.11.17
07 WinAPI) Window 창 받아 만들기  (0) 2023.11.15
05 WinAPI) PeekMessage  (0) 2023.11.11
04 WinAPI) 핸들과 DC(2)  (0) 2023.11.10
03 WinAPI) 핸들과 DC(1)  (0) 2023.11.09