디자인패턴 - Observer(옵저버) 패턴
Intro
디자인 패턴 중 옵저버(Observer) 패턴에 대해서 공부한내용을 정리했습니다.
우리 일상에서 옵저버 패턴과 유사한것중에 하나가 바로 유튜브 “구독” 입니다.
유튜버가 채널에 동영상을 업로드하거나, 게시글을 작성하면 그 알람이 채널의 “구독자”들에게 알람이갑니다.
구독자들은 이 알림을 통해 동영상을 시청하고, 게시글에 댓글은 남긴다던지의 행동을 취할 수 있습니다.
이런 구조를 디자인패턴으로 만든것이 바로 옵저버 패턴입니다.
유니티에서의 옵저버 패턴
유니티에서는 옵저버 패턴이라는 말을 들어보지않았어도, 개발을 하면서 나도모르게 옵저버 패턴을 사용한 경우가 있을수 있습니다.
유니티의 UnityEvent 혹은 C#의 Action이 바로 대표적인 옵저버 패턴이기 때문입니다.
유니티 이벤트를 예시로,
public class Health
{
public event Action OnHealthChanged;
private int health;
// 데미지 받음
public void TakeDamage(int amount)
{
health -= amount;
OnHealthChanged?.Invoke(); // 체력이 변했음을 알림
}
}
플레이어의 체력을 관리하는 “Health” 클래스가 있습니다.
적에게 데미지를 입어 체력을 잃었을 때 함수 TakeDamge()가 호출됩니다.
받은 데미지만큼 체력을 깎고, 체력이 변했음을 알리는 이벤트 OnHealthChanged 가 발생합니다.
public class HealthUI : Monobehaviour
{
public Health health;
void OnEnable()
{
// 이벤트 구독(옵저버 등록)
health.OnHealthChanged += UpdateUI;
}
void OnDisable()
{
// 이벤트 해제(옵저버 해제)
health.OnHealthChanged -= UpdateUI;
}
void UpdateUI()
{
Debug.Log("체력 업데이트 됨");
}
}
플레이어의 체력UI를 관리하는 “HealthUI” 클래스가 있습니다.
UI가 활성화될때 OnHealthChanged 이벤트를 구독합니다 => 옵저버로 등록됨
따라서,
플레이어가 체력을 잃게되면 Health 클래스에서 OnHealthChanged 이벤트가 호출되었음을 알리고
이를 구독하고있는 HealthUI 클래스에서 UpdateUI가 호출되도록 하여 체력 UI를 업데이트합니다.
옵저버 패턴을 왜 사용하는가?
예제의 구조를 보면 알수있듯이, 이벤트가 발생했음을 알리는 객체(Subject/Health)는
어떤 객체(Observer)가 이벤트를 구독하고있는지 알 필요가 없습니다.
따라서 객체간의 결합도가 낮아지고, 시스템의 유연성이 증가하는 장점이 있습니다.
또한 새로운 옵저버를 쉽게 추가할 수 있으며, 주체(Subject)와 옵저버를 자유롭게 독립적으로 사용할 수 있습니다.
하지만 주의해야할점은
옵저버의 수가 많아지면 시스템이 복잡해질 수 있으며, 옵저버들이 주체의 상태 변화를 감지할 때
알림을 받는 순서를 알 수 없기때문에 예기치 못한 순서로 업데이트 될 수 있습니다.
따라서 상황에 따라 필요한 만큼만 적절히 활용하는것이 좋습닏나.
댓글남기기