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. 동작 흐름
- Observer가 Subject에 등록
- Subject 상태 변경
- Subject가 모든 Observer에게 Notify
- 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 |