1 분 소요

Intro

디자인 패턴 중 옵저버(Observer) 패턴에 대해서 공부한내용을 정리했습니다.

image

우리 일상에서 옵저버 패턴과 유사한것중에 하나가 바로 유튜브 “구독” 입니다.

유튜버가 채널에 동영상을 업로드하거나, 게시글을 작성하면 그 알람이 채널의 “구독자”들에게 알람이갑니다.

구독자들은 이 알림을 통해 동영상을 시청하고, 게시글에 댓글은 남긴다던지의 행동을 취할 수 있습니다.

이런 구조를 디자인패턴으로 만든것이 바로 옵저버 패턴입니다.

유니티에서의 옵저버 패턴

유니티에서는 옵저버 패턴이라는 말을 들어보지않았어도, 개발을 하면서 나도모르게 옵저버 패턴을 사용한 경우가 있을수 있습니다.

유니티의 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)와 옵저버를 자유롭게 독립적으로 사용할 수 있습니다.


하지만 주의해야할점은

옵저버의 수가 많아지면 시스템이 복잡해질 수 있으며, 옵저버들이 주체의 상태 변화를 감지할 때

알림을 받는 순서를 알 수 없기때문에 예기치 못한 순서로 업데이트 될 수 있습니다.

따라서 상황에 따라 필요한 만큼만 적절히 활용하는것이 좋습닏나.

태그: ,

카테고리:

업데이트:

댓글남기기