GameDevelop/Notes

옵저버 패턴 (Observer Pattern)

Une_ 2026. 1. 11. 18:15

 

1. 한 줄 정의

옵저버 패턴은
한 객체의 상태 변화가 발생했을 때
이를 구독한 객체들에게 자동으로 알리는 패턴이다.

 

2. 왜 옵저버 패턴이 필요한가?

다음과 같은 문제를 해결하기 위해 사용한다.

  • 객체 간 강한 결합(Dependency) 제거
  • 상태 변화에 대한 자동 통지
  • 이벤트 기반 구조 구현
// 나쁜 예
Player.TakeDamage();
UI.UpdateHP();
Sound.Play();
Quest.Check();

👉 Player가 너무 많은 걸 알고 있음

 

3. 기본 구성 요소

1) Subject (Publisher)

  • 상태를 가지고 있음
  • 옵저버를 등록 / 제거 / 통지

2) Observer (Subscriber)

  • Subject의 변화를 통지받음
  • 갱신 로직 수행

 

4. 구조 다이어그램 (개념)

Observer  ←─┐
Observer  ←─┼─  Subject
Observer  ←─┘

 

5. 동작 흐름

  1. Observer가 Subject에 등록
  2. Subject 상태 변경
  3. Subject가 모든 Observer에게 Notify
  4. Observer가 Update 수행

 

6. 간단한 C++ 예제

 
class Observer
{
public:
    virtual void OnNotify(int HP) = 0;
};

class Player
{
public:
    void AddObserver(Observer* obs)
    {
        Observers.push_back(obs);
    }

    void TakeDamage(int dmg)
    {
        HP -= dmg;
        Notify();
    }

private:
    void Notify()
    {
        for (auto* obs : Observers)
            obs->OnNotify(HP);
    }

    int HP = 100;
    std::vector<Observer*> Observers;
};

 

7. 장점

항목 설명
결합도 감소 Subject는 Observer의 존재만 앎
확장성 새로운 Observer 추가 쉬움
이벤트 구조 비동기/이벤트 기반에 적합

 

8. 단점

  • Observer 순서 보장 ❌
  • 디버깅 어려움
  • 과도한 알림은 성능 저하
  • 순환 참조 위험

 

9. 게임 개발에서의 활용 예

  • 체력 변화 → UI 갱신
  • 상태 변화 → 사운드 / 이펙트
  • 퀘스트 진행 조건 체크
  • 네트워크 상태 동기화

 

10. Unreal Engine 관점

1) 델리게이트 (Delegate)

Unreal은 옵저버 패턴을 델리게이트로 제공한다.

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHPChanged, int32, NewHP);

UPROPERTY(BlueprintAssignable)
FOnHPChanged OnHPChanged;
OnHPChanged.Broadcast(NewHP);

 

2) 이벤트 디스패처

  • Blueprint 기반 옵저버 패턴
  • UI / Gameplay 연결에 많이 사용

 

11. 요약

옵저버 패턴은 상태 변화를 구독자에게 자동으로 통지해
객체 간 결합도를 낮추고 확장성을 높이는 패턴입니다.

 

 

 

'GameDevelop > Notes' 카테고리의 다른 글

렌더링 파이프라인  (0) 2026.01.20
싱글톤 패턴 (Singleton Pattern)  (1) 2026.01.11
가상 함수 테이블 (Virtual Table, vtable)  (0) 2026.01.11
해시테이블과 해시충돌  (0) 2026.01.09
A* 알고리즘  (0) 2026.01.05