1. 개요
Observer Pattern은 객체 간의 1:N 관계를 설정하여 한 객체의 상태 변화가 다른 객체들에게 자동으로 통지되도록 만드는 디자인 패턴입니다. 게임에서 UI 업데이트, 이벤트 처리, 데이터 동기화와 같은 상황에서 자주 사용됩니다. 🎯
2. 개념
Observer Pattern은 다음 두 가지 주요 구성 요소로 이루어집니다:
- Subject (주체): 상태를 보유하며 Observer들을 등록하거나 해제하고, 상태가 변경될 때 Observer들에게 알리는 역할을 합니다.
- Observer (관찰자): Subject를 구독하여 상태 변경 알림을 수신하고 적절한 작업을 수행합니다.
이 패턴은 느슨한 결합(loose coupling)을 유지하도록 설계되어, 코드의 유지보수가 쉬워집니다. 🔧
3. 예제
아래는 Unity3D에서 Observer Pattern을 구현한 간단한 예제입니다.
namespace System
{
public interface IObservable<out T>
{
IDisposable Subscribe(IObserver<T> observer);
}
public interface IObserver<in T>
{
void OnCompleted();
void OnError(Exception error);
void OnNext(T value);
}
}
위 인터페이스를 구현한 예제는 이 링크를 참고바랍니다.
구현 시나리오
플레이어의 체력이 변할 때 UI를 자동으로 업데이트하는 상황을 가정합니다.
using System;
using System.Collections.Generic;
using UnityEngine;
// Subject: PlayerHealth
public class PlayerHealth : MonoBehaviour
{
public event Action<int> OnHealthChanged; // Observer들에게 알림
private int health;
public int Health
{
get => health;
set
{
health = value;
OnHealthChanged?.Invoke(health); // 상태 변경 시 알림
}
}
}
// Observer: HealthUI
public class HealthUI : MonoBehaviour
{
[SerializeField] private PlayerHealth playerHealth;
private void OnEnable()
{
playerHealth.OnHealthChanged += UpdateUI; // 이벤트 구독
}
private void OnDisable()
{
playerHealth.OnHealthChanged -= UpdateUI; // 이벤트 해제
}
private void UpdateUI(int currentHealth)
{
Debug.Log($"Player Health Updated: {currentHealth}");
// 실제 UI 업데이트 로직 삽입
}
}
주요 흐름
- PlayerHealth 클래스는 OnHealthChanged 이벤트를 통해 Observer들에게 체력 변경 사항을 알립니다.
- HealthUI 클래스는 해당 이벤트를 구독하여 체력 변경 시 UI를 업데이트합니다. 💡
4. Observer Pattern 활용 시 주의점
💡 이벤트 관리의 중요성
Observer Pattern은 강력하지만, 이벤트 해제를 적절히 처리하지 않으면 메모리 누수와 같은 문제가 발생할 수 있습니다. 특히 Unity3D에서는 OnEnable과 OnDisable에서 이벤트 등록과 해제를 관리하는 것이 중요합니다.
5. 결론
Observer Pattern은 객체 간의 관계를 간결하게 설정하고 유지보수를 용이하게 만듭니다. 특히, 게임 개발에서 UI 동기화, 이벤트 관리, 데이터 변경 반영과 같은 작업에 유용합니다. 하지만 이벤트 관리에 신경 쓰지 않으면 오히려 버그를 유발할 수 있으므로 주의가 필요합니다. 🚀
6. 관련 링크
관찰자 디자인 패턴 - .NET
.NET의 관찰자 디자인 패턴에 대해 알아봅니다. 이 패턴은 구독자가 공급자에 등록하고 공급자로부터 알림을 받을 수 있게 합니다.
learn.microsoft.com
'Workspace > Design Pattern' 카테고리의 다른 글
어댑터 패턴 (Adapter Pattern): 호환되지 않는 인터페이스 연결하기 (0) | 2025.01.22 |
---|---|
데코레이터 패턴 (Decorator Pattern): 유연한 기능 확장의 비밀 (0) | 2025.01.22 |
팩토리 패턴 (Factory Pattern): 객체 생성의 유연함을 더하다 (0) | 2025.01.22 |
전략 패턴 (Strategy Pattern): 유연한 알고리즘 선택의 열쇠 (0) | 2025.01.22 |
싱글톤 패턴 (Singleton Pattern) (0) | 2025.01.22 |