๊ด€์ฐฐ์ž(Observer) ํŒจํ„ด

2023. 6. 8. 16:13ยท๐Ÿ–ฅ๏ธ Study Note/Design Patteren
๊ด€์ฐฐ์ž ํŒจํ„ด์€ GoF ํŒจํ„ด ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์ž˜ ์•Œ๋ ค์กŒ์ง€๋งŒ,
์„ธ์ƒ์„ ๋“ฑ์ง€๊ณ  ์‚ด์•„๊ฐ€๋Š” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ƒํŒ ์ฒ˜์Œ ๋“ฃ๋Š” ์ด์•ผ๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

{ ๊ด€์ฐฐ์ž ํŒจํ„ด์ด๋ž€? }

๊ด€์ฐฐ์ž ํŒจํ„ด์€ GoF์˜ ํ–‰์œ„ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ,

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

์ฃผ๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๊ฐ„์— ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑ•๋ฐœ์ƒ(Publish)ํ•˜๊ณ , ์ด๋ฅผ ์ˆ˜์‹ (Subscribe)ํ•ด์•ผ ํ•  ๋•Œ ์ด์šฉํ•œ๋‹ค.

  • ๊ด€์ฐฐ์ž ํŒจํ„ด์€ MVC(Model View Controller) ๊ตฌ์กฐ์˜ ๊ธฐ๋ฐ˜์ด๋‹ค.
  • ์ž๋ฐ”์˜ EventListener๋‚˜ C#์˜ delegate์™€ ๊ฐ™์ด ๊ฐ™์€ ๋ชจ๋˜ OOP ์–ธ์–ด์—์„œ๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ด€์ฐฐ์ž ํŒจํ„ด์„ ์ง€์›ํ•œ๋‹ค.

{ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ๊ด€์ฐฐ์ž ํŒจํ„ด ํ™œ์šฉํ•˜๊ธฐ : ์—…์  ์‹œ์Šคํ…œ }

๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ ์—…์  (์ถœ์ฒ˜ - https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=adoll21&logNo=221343569529)

๊ฒŒ์ž„ ์—…์ ์€ ์ข…๋ฅ˜๊ฐ€ ๋งŽ๊ณ  ๊ทธ๋งŒํผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด '๋‹ค๋ฆฌ์—์„œ ๋‚™ํ•˜ํ•˜๊ธฐ'๋ผ๋Š” ์—…์ ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.
๋ฌผ๋ฆฌ ์—”์ง„ ํ•œ ๊ฐ€์šด๋ฐ์— UnlockFallOffBridge() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋”์ฐํ•œ ์ง“์„ ํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค. 

 

์ด๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๊ด€์ฐฐ์ž ํŒจํ„ด์ด๋‹ค.
๊ด€์ฐฐ์ž ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด ์–ด๋–ค ์ฝ”๋“œ์—์„œ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ˆ„๊ฐ€ ๋ฐ›์€ ์ƒ๊ด€์—†์ด ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

void Physics::updateEntity(Entity& entity) 
{ 

  bool wasOnSurface = entity.isOnSurface(); 

  entity.accelerate(GRAVITY); 

  entity.update();

  if(wasOnSurface && !entity.isOnSurface()) 
  { 
    notify(entity, EVENT_START_FALL);
  }

}

 

์—…์  ์‹œ์Šคํ…œ์€ ๋ฌผ๋ฆฌ ์—”์ง„์ด ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์Šค์Šค๋กœ ๋“ฑ๋กํ•œ๋‹ค.
์—…์  ์‹œ์Šคํ…œ์€ ๋ฌผ๋ฆฌ ์—”์ง„์ด ๋ณด๋‚ด์˜ค๋Š” ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ๋–จ์–ด์ง€๋Š” ๋ฌผ์ฒด๊ฐ€ Player๊ฐ€ ๋งž๋Š”์ง€, Player๊ฐ€ ๋–จ์–ด์ง€๊ธฐ ์ „์— ์žˆ๋˜ ๊ณณ์ด ๋‹ค๋ฆฌ์ธ์ง€ ํ™•์ธํ•œ ๋’ค์— ์—…์ ์„ ์ž ๊ธˆ ํ•ด์ œํ•œ๋‹ค.

 

์ด๋Ÿฐ ๊ณผ์ •์„ ๋ฌผ๋ฆฌ ์—”์ง„์€ ์ „ํ˜€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.๋ฌผ๋ฆฌ ์—”์ง„์€ ๋ˆ„๊ฐ€ ๋ฐ›๋“  ์•ˆ๋ฐ›๋“  ํŠน์ • ์กฐ๊ฑด์—์„œ ๊ณ„์† ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ๋ฟ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๊ด€์ฐฐ์ž ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ๋ฌผ๋ฆฌ ์—”์ง„๊ณผ ์—…์  ์‹œ์Šคํ…œ์˜ ์ปคํ”Œ๋ง์„ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋‹ค.

{ ๊ด€์ฐฐ์ž ํŒจํ„ด ์ธํ„ฐํŽ˜์ด์Šค }

1. ๊ด€์ฐฐ์ž(Observer)

Observer ํด๋ž˜์Šค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. Observer ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

**์–ธ์–ด์— ๋”ฐ๋ผ์„œ ์ œ๋„ค๋ฆญ(generic) ํ˜น์€ ํ…œํ”Œ๋ฆฟ ๊ฐ™์€ ๊ฑธ ์จ๋„ ๋˜์ง€๋งŒ, ๊ทธ๋ƒฅ ํ•„์š”์— ๋งž๊ฒŒ ์›ํ•˜๋Š” ์ž๋ฃŒํ˜•์„ ์ „๋‹ฌํ•ด๋„ ๋œ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ๊ฒŒ์ž„ ๊ฐœ์ฒด์™€ ๋ฌด์Šจ ์ผ์ด์—ˆ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์„ ํ•˜๋“œ์ฝ”๋”ฉํ•ด์„œ ๋„ฃ์—ˆ๋‹ค.

class Observer 
{

  public: virtual ~Observer() {}

  virtual void onNotify(const Entity& entity, Event event) = 0;

};

์–ด๋–ค ํด๋ž˜์Šค๋“  Observer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๊ด€์ฐฐ์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ•œ ์—…์  ์‹œ์Šคํ…œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋‹ค.

class Achievements : public Observer 
{ 

public:
  virtual void onNotify(const Entity& entity, Event event) 
  { 
    switch (event) 
    {

      case EVENT_ENTITY_FELL:
        if(entity.isHero() && heroIsOnBridge_) 
        { 
          unlock(ACHIEVEMENT_FELL_OFF_BRIDGE);
        }
        break;

        // ๊ทธ ์™ธ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ ...

        // heroIsOnBridge_ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค...
    }
  }

private:
  void unlock(Achievement achievement) 
  {

    // ์•„์ง ์—…์ ์ด ์ž ๊ฒจ ์žˆ๋‹ค๋ฉด ์ž ๊ธˆํ•ด์ œํ•œ๋‹ค...

  }

  bool heroIsOnBridge_;

};

2. ๋Œ€์ƒ(Subject)

Subject ํด๋ž˜์Šค๋Š” ์•Œ๋ฆผ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

  • Subject ํด๋ž˜์Šค ์•Œ๋ฆผ์„ ๋ฐ›์„ ๊ด€์ฐฐ์ž ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋ˆ„๊ตฌ๋“  ๊ด€์ฐฐ์ž๋กœ ๋“ฑ๋ก๋˜๊ณ  ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ์—ด์–ด๋‘ฌ์•ผ ํ•œ๋‹ค. 
  • Subjectํด๋ž˜์Šค๋Š” ๊ด€์ฐฐ์ž๋“ค์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ธ๋‹ค.
class Subject 
{
private: 
	Observer* 	m_Observers[MAX_OBSERVERs];
    int 		m_iNumOfObservers;
    
public:
	void AddObserver(Observer* _obs)
    {
    	// ๋ฐฐ์—ด์— ์˜ต์ €๋ฒ„ ์ถ”๊ฐ€
    }
    
    void RemoveObserver(Observer* _obs)
    {
    	// ๋ฐฐ์—ด์— ์˜ต์ €๋ฒ„ ์‚ญ์ œ
    }

protected:
	void notify(const Entitiy& entitiy, Event event)
    {
    	for(const auto& o : m_Observers)
        {
        	o->onNotify(entity, event); 
        }
    }
    
}

Subject์˜ ์˜ต์ €๋ฒ„ ์ปจํ…Œ์ด๋„ˆ ๊ฐœ์„ ํ•˜๊ธฐ

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ์ •์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์—ฌ ๊ด€์ฐฐ์ž๋“ค์„ ์ €์žฅํ•˜์˜€์ง€๋งŒ,

์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋™์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

๋™์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ต์ €๋ฒ„๋ฅผ ์ €์žฅํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

  1. ์žฆ์€ ๋™์  ํ• ๋‹น
  2. ์˜ต์ €๋ฒ„ ์ถ”๊ฐ€, ์‚ญ์ œ์— ๋”ฐ๋ฅธ ๋น„์šฉ

์˜ต์ €๋ฒ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ”๊พธ๋ฉด ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ๋“ค์„ Pool๋กœ ๊ด€๋ฆฌ
    ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ๋“ค์€ ๋ชจ๋‘ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜์—ฌ Pool๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 
    Pool๋กœ ๋…ธ๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋ฉด, ์˜ต์ €๋ฒ„๊ฐ€ ์ถ”๊ฐ€/์‚ญ์ œ ๋  ๋•Œ๋งˆ๋‹ค ๋™์  ํ• ๋‹น/ํ•ด์ œ๋ฅผ ํ•˜๋Š” ์ผ์ด ์—†์–ด์ ธ ์žฆ์€ ๋™์  ํ• ๋‹น์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™”๋‚˜ ์†๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.
  2. ๋ฆฌ์ŠคํŠธ๋Š” ์ค‘๊ฐ„ ๊ฐ’ ์‚ญ์ œ ๋น„์šฉ์ด O(1)์ด๋‹ค.
    vector์— ๊ฒฝ์šฐ ์ค‘๊ฐ„ ๊ฐ’์„ ์‚ญ์ œํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์ด ์ผ์–ด๋‚˜ O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ ๋ฆฌ์ŠคํŠธ๋Š” ์ค‘๊ฐ„ ๊ฐ’ ์‚ญ์ œ์— O(1)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค ๋น ๋ฅด๋‹ค.

{ ์ฃผ์˜ํ•  ์  }

1. ๊ด€์ฐฐ์ž ํŒจํ„ด์€ ๋™๊ธฐ์ ์ž„์„ ๊ธฐ์–ตํ•˜์ž.

๊ด€์ฐฐ์ž ํŒจํ„ด์€ ๋™๊ธฐ์ ์ด๋‹ค.
๋Œ€์ƒ(Subject)์ด ๊ด€์ฐฐ์ž(Observer) ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ด€์ฐฐ์ž๊ฐ€ ์•Œ๋ฆผ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์—๋Š” ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ๊ด€์ฐฐ์ž ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋А๋ฆฌ๋ฉด ๋Œ€์ƒ์ด ๋ธ”๋ก๋  ์ˆ˜๋„ ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ ๊ด€์ฐฐ์ž๋ฅผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ, ๋ฝ(lock)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ •๋ง ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

์–ด๋–ค ๊ด€์ฐฐ์ž๊ฐ€ ๋Œ€์ƒ์˜ ๋ฝ์„ ๋ฌผ๊ณ  ์žˆ๋‹ค๋ฉด ๊ฒŒ์ž„ ์ „์ฒด๊ฐ€ ๊ต์ฐฉ์ƒํƒœ์— ๋น ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์—”์ง„์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŽ์ด ์“ฐ๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฒคํŠธ ํ๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์†Œํ†ตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

2. ์‚ฌ๋ผ์ง„ ๊ด€์ฐฐ์ž์— ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ง€ ์•Š๊ฒŒ ์ฃผ์˜ํ•˜์ž.

๋Œ€์ƒ์€ ๊ด€์ฐฐ์ž๋“ค์˜ ํฌ์ธํ„ฐ๋ฅผ ์ฐธ์กฐํ•ด ๊ด€์ฐฐ์ž๋“ค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

๋Œ€์ƒ์ด ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋œ ๊ด€์ฐฐ์ž์— ์ ‘๊ทผํ•ด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์‹œ๋„ํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ฒŒ์ž„์ด ๋ปฅ-! ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ด€์ฐฐ์ž์˜ ์†Œ๋ฉธ์ž์—์„œ Subject::RemoveObserver(this) ๋ฅผ ๊ผญ ํ˜ธ์ถœํ•ด์ฃผ์ž.

 

3. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ์ง€์›์„ ๋ฐ›๋”๋ผ๋„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ด€์ฐฐ์ž๋Š” ๊ผญ RemoveObserver()๋ฅผ ํ˜ธ์ถœํ•˜์ž.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ์ง€์›์„ ๋ฐ›๋”๋ผ๋„ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋‹ค.

๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ด€์ฐฐ์ž๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋ฐฉ์น˜ํ•˜์ง€ ๋ง์ž.

๋Œ€์ƒ์ด ํ•ด๋‹น ๊ด€์ฐฐ์ž๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ํ•œ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ํ•ด๋‹น ๊ด€์ฐฐ์ž๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์€ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์—์„œ ๊ต‰์žฅํžˆ ์ž์ฃผ ์ผ์–ด๋‚˜๋Š” ์ผ๋กœ '์‚ฌ๋ผ์ง„ ๋ฆฌ์Šค๋„ˆ ๋ฌธ์ œ' ๋ผ๋Š” ์ด๋ฆ„๊นŒ์ง€ ๋ถ™์„ ์ •๋„๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ์ง€์›์„ ๋ฐ›๋”๋ผ๋„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ด€์ฐฐ์ž๋Š” ๊ผญ RemoveObserver()๋ฅผ ํ˜ธ์ถœํ•˜์ž.

 

 

reference

๋„์„œ : ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ–ฅ๏ธ Study Note > Design Patteren' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํ”„๋กœํ† ํƒ€์ž…(ProtoType) ํŒจํ„ด  (0) 2023.06.19
๊ฒฝ๋Ÿ‰(FlyWeight) ํŒจํ„ด  (2) 2023.06.07
๋ช…๋ น(Command) ํŒจํ„ด  (2) 2023.06.05
๋””์ž์ธ ํŒจํ„ด์ด๋ž€?  (0) 2023.06.05
'๐Ÿ–ฅ๏ธ Study Note/Design Patteren' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ํ”„๋กœํ† ํƒ€์ž…(ProtoType) ํŒจํ„ด
  • ๊ฒฝ๋Ÿ‰(FlyWeight) ํŒจํ„ด
  • ๋ช…๋ น(Command) ํŒจํ„ด
  • ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?
Beankong_
Beankong_
์ฃผ๋‹ˆ์–ด ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ณต๋ถ€ ๊ธฐ๋ก
  • Beankong_
    Beankong's Devlog
    Beankong_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด ๊ธ€ (146)
      • โ›… Daily (0)
      • ๐Ÿ–ฅ๏ธ Study Note (2)
        • C++ (1)
        • Unreal Engine (5)
        • Coding Test (123)
        • Design Patteren (5)
        • VCS (Git..) (1)
        • Server (1)
      • ๐Ÿงญ Devlog (8)
        • ์˜ค๋‹ต๋…ธํŠธ (4)
        • UE5 GameLift Server Test Project (1)
        • TIL (3)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๋งํฌ

    • ๊ณต์ง€์‚ฌํ•ญ

    • ์ธ๊ธฐ ๊ธ€

    • ํƒœ๊ทธ

      ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      unrealengine build system
      ๊ทธ๋ฆฌ๋””(greedy)
      ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
      ์•Œ๊ณ ๋ฆฌ์ฆ˜
      ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ
      propertyaccess
      cpp
      OnlineSubsystem
      unrealengine module
      ํ—ฌํ…Œ์ด์ปค
      ํ”„๋ฃŒ๊ทธ๋ž˜๋จธ์Šค
      ๊ฒŒ์ž„ ๊ฐœ๋ฐœ
      ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
      UnrealEngine
      ๊ฒŒ์ž„ ๋ชจ์ž‘
      programmers
      UnrealEngine5
      ๊ฒŒ์ž„ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์ตœ๊ทผ ๋Œ“๊ธ€

    • ์ตœ๊ทผ ๊ธ€

    • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
    Beankong_
    ๊ด€์ฐฐ์ž(Observer) ํŒจํ„ด
    ์ƒ๋‹จ์œผ๋กœ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”