๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Singleton Patten

by eazuooz 2022. 9. 13.

์˜ˆ์ œ :) https://github.com/eazuooz/WindowAPI/tree/ccd364e29392d46b4bfa76bcc4268d49eace278e

 

GitHub - eazuooz/WindowAPI

Contribute to eazuooz/WindowAPI development by creating an account on GitHub.

github.com

์˜ค์ง ํ•œ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ–๋„๋ก ๋ณด์žฅํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ์ „์—ญ์ ์ธ ์ ‘๊ทผ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

(GOF์˜ ๋””์ž์ธ ํŒจํ„ด 181p)

Gof์˜ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์˜๋„์™€ ๋‹ฌ๋ฆฌ ๋“๋ณด๋‹ค๋Š” ์‹ค์ด ๋งŽ๋‹ค. Gof๋„ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ๋‚จ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ๊ฐ•์กฐ ํ–ˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๋“ค ์ค‘์—์„œ ๊ท€๋‹ด์•„ ๋“ฃ๋Š” ์ด๋Š” ๋งŽ์ง€ ์•Š๋‹ค.

 

๋‹ค๋ฅธ ํŒจํ„ด๋“ค๋„ ๊ทธ๋ ‡์ง€๋งŒ, ์‹ฑ๊ธ€ํ„ด์„ ๋ถ€์ ๋‹นํ•œ ๊ณณ์— ์‚ฌ์šฉํ•˜๋ฉด ์ด์ƒ์— ๋ถ€๋ชฉ์„ ๋Œ€๋Š” ๊ฒƒ๋งŒํผ์ด๋‚˜ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค.

์›Œ๋‚™ ๋‚จ์šฉ ๋˜๋Š” ํŒจํ„ด์ด๋‹ค ๋ณด๋‹ˆ ์‹ฑ๊ธ€ํ„ด์„ ํ”ผํ•  ๋ฐฉ๋ฒ•์„ ์ฃผ๋กœ ๋‹ค๋ฃจ๊ฒ ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์šฐ์„ ์€ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.

 

//์ฒซ๋ฒˆ์งธ ์˜ˆ
class FileSystem 
{
public:
    static FileSystem& instance() 
    {
        if(instance_ NULL) {
            instance_ = new FileSystem();
        }
        return *instance_;
    }

private:
    FileSystem() {}
    static FileSystem* instance_;
}

//๋‘๋ฒˆ์งธ ์˜ˆ
class FileSystem 
{
public:
    static FileSystem& instance() 
    {
        static FileSystem* instance = new FileSystem();
        return *instance;
    }

private:
    FileSystem() {}
}
์ถœ์ฒ˜: https://boycoding.tistory.com/109 [์†Œ๋…„์ฝ”๋”ฉ:ํ‹ฐ์Šคํ† ๋ฆฌ]
	class Application
	{
	public:
		static Application& GetInstance()
		{
			if (mDestroyed)
			{
				 new(mInstance) Application();
				 atexit(KillApplication);
				 mDestroyed = false;
			}
			else if (mInstance == nullptr)
			{
				Create();
			}
			return *mInstance;
		}

		

	private:
		Application() {}
		Application(const Application& other) {}
		~Application() { mDestroyed = true; }

		static void Create()
		{
			static Application instance;
			mInstance = &instance;
		}
		static void KillApplication()
		{
			mInstance->~Application();
		}

		static Application* mInstance;
		static bool mDestroyed;
	};

์ „์—ญ์ ์ธ ์ ‘๊ทผ์ ์„ ์ œ๊ณต

๋กœ๊น…, ์ฝ˜ํ…์ธ  ๋กœ๋”ฉ, ๊ฒŒ์ž„ ์ €์žฅ๋“ฑ ์—ฌ๋Ÿฌ ๋‚ด๋ถ€ ์‹œ์Šคํ…œ์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ ˆํผ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ์ด๋“ค ์‹œ์Šคํ…œ์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ, ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „์—ญ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

์‹ฑ๊ธ€ํ„ด์„ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

1. ํ•œ๋ฒˆ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„์˜ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. ๋Ÿฐํƒ€์ž„์— ์ดˆ๊ธฐํ™”๋œ๋‹ค.

3. ์‹ฑ๊ธ€ํ„ด์„ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ์šฐ๋ฆฌ ๊ฒŒ์ž„ ์—”์ง„์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์„ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค์–ด๋ณด์ž.

์—”์ง„์„ ์„ค๊ณ„ ํ•˜๊ธฐ์— ์•ž์„œ ์ž์ฃผ ์‚ฌ์šฉํ•ด์•ผํ•  ๋ฐ์ดํ„ฐํƒ€์ž…๋“ค์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๊ทธ๋ฆฌ๊ณ  ์ž๋ฃŒํ˜•๋“ค์„ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘๋ ค๊ณ  ํ•œ๋‹ค.

Common.h ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค์•ˆ์— ์ž์ฃผ ์‚ฌ์šฉ ๋˜๋Š” STL๊ณผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์„ ์„ ์–ธํ•ด๋‘์—ˆ๋‹ค.

 

#pragma once

#include "framework.h"

#include <string>
#include <vector>
#include <list>
#include <map>

using std::vector;
using std::list;
using std::map;
using std::make_pair;
using std::string;
using std::wstring;

struct WindowImplData
{
    HWND hWnd;
    HDC  hdc;
    UINT height;
    UINT width;

    void Clear()
    {
        hWnd = NULL;
        hdc = NULL;
        height = 0;
        width = 0;
    }
};

struct Vector2
{
    float y;
    float x;
};

using Pos = POINT;

 

์šฐ๋ฆฌ์˜ ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ Application ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. 

#pragma once
#include "Common.h"
// ์šฐ๋ฆฌ์˜ ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ
// Singleton patten

namespace ya
{
	class Application
	{
	public:
		static Application& GetInstance()
		{
			if (mInstance == nullptr)
			{
				mInstance = new Application();
			}
			return *mInstance;
		}

		Application();
		~Application();

		void Initialize(WindowImplData data);
		void Tick();

	private:
		static Application* mInstance;
		static int mIsStatic;
		
		WindowImplData mWindowData;
	};
}

Initialize ํ•จ์ˆ˜์—์„œ ์ดˆ๊ธฐํ™”์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์„ธํŒ…ํ•ด์ค€๋‹ค.

Tick() ํ•จ์ˆ˜๋Š” main ํ•จ์ˆ˜์—์„œ  ์šฐ๋ฆฌ๊ฐ€ GetMessage๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ๋ถ€๋ถ„์ธ PeekMessage์˜ ๊ฒŒ์ž„ ์‹คํ–‰๋ถ€๋ถ„์—์„œ

๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์‹คํ–‰๋ ๊ฒƒ์ด๋‹ค.

    while(true)
    {
        if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
        {
            if (WM_QUIT == msg.message)
                break;
            
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        } 
        else
        {
            // ๊ฒŒ์ž„ ์‹คํ–‰
            ya::Application::GetInstance().Tick();
        }
    }

 

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ ์•ž์œผ๋กœ ์‚ฌ์šฉ๋  ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉ๋  Entity  ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.

์ด๋ฆ„์ด ํ•„์š”ํ•œ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ๋‚ด์—์„œ ํ• ๋‹น๋œ ๊ฐ์ฒด๋“ค์€ ์ด Entity ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

Entity ํด๋ž˜์Šค๋Š” ๊ณตํ†ต์ ์œผ๋กœ Class๋กœ ์„ ์–ธ๋œ ์ž๋ฃŒํ˜•๋“ค์ด ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์˜ˆ : ์ด๋ฆ„, ๊ฒฝ๋กœ, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋“ฑ

#pragma once
#include "Common.h"

namespace ya
{
	class Entity
	{
	public:
		Entity();
		virtual ~Entity();

		void SetName(const wstring& name) { mName = name; }
		const wstring& GetName() { return mName; }

	private:
		wstring mName;
	};
}

 

Object๋ž€ ์šฐ๋ฆฌ ๊ฒŒ์ž„์—์„œ ํ™”๋ฉด์ƒ์— ๋‚˜๋‚˜ํƒ€๋‚ผ ๋ชจ๋“  ๋ฌผ์ฒด๋ฅผ ํ•˜๋‚˜์˜ Object๋ผ๊ณ  ์ •์˜ ํ•˜๊ฒ ๋‹ค.

ํ”Œ๋ ˆ์ด์–ด, ๋ชฌ์Šคํ„ฐ, UI ๋“ฑ๋“ฑ ์ถ”๊ฐ€๋กœ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” Timer๋‚˜ ๋ชฌ์Šคํ„ฐ ์Šคํฐ์„ ๋„์™€์ฃผ๋Š” Class๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋“ฑ ๋ˆˆ์— ๋ณด์ง€์ด ์•Š๋Š”๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค.

๋‹ค์‹œ๋งํ•ด์„œ Class๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋œ ์•„์ด๋“ค์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

๋ณ€์ˆ˜๋“ฑ์„ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋‹จ์œ„๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.

์ง€๊ธˆ ๋‹น์žฅ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ธฐ์—๋Š” ์–ด๋ ค์šฐ๋‹ˆ ์ด์ •๋„๋งŒ ์•Œ๊ณ  ๋„˜์–ด ๊ฐ€๋„๋ก ํ•˜์ž

#pragma once
#include "Common.h"
#include "yaEntity.h"

namespace ya
{
	class Object : public Entity
	{
	public:
		Object();
		~Object();

	private:
		Pos mPos;
	};
}

๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ผ์„œ ์‹คํ–‰์‹œ์ผœ ๋ณด์ž.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ขŒ์šฐ์ƒํ™” ๋ฐฉํ–ฅํ‚ค๋ฅผ ์ด์šฉํ•ด ํ™”๋ฉด์— ์‚ฌ๊ฐํ˜•์ด ์ด๋™ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ ์—†์ด ๊ตฌ์กฐ๋ฅผ ์™„์„ฑ์‹œํ‚จ๊ฒƒ์ด๋‹ค.

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Input  (0) 2022.09.15
Scene, Object, Time  (0) 2022.09.15
FrameWork  (1) 2022.09.07
DC์˜ ์ •๋ณด์ˆ˜์ •  (0) 2022.09.06
WinMain  (2) 2022.09.05

๋Œ“๊ธ€