디자인패턴

[디자인 패턴] 옵저버 패턴 (Observer Pattern)

KimGeon-U 2025. 2. 28. 20:36

 

 

언리얼 프로젝트를 진행하며, 느슨한 결합을 유지하기위해 델리게이트를 사용하게 되었습니다.

델리게이트를 사용 하던 중, 델리게이트는 기존에 학습하였던 옵저버 패턴(Observer Pattern)을 사용한 것 같다고 느껴졌습니다.

이를 기반으로 옵저버패턴의 정의와 특징 그리고 게임 클라이언트 환경에서 옵저버 패턴을 적용한 경우들에 대해 알아보겠습니다.

※ 델리게이트 (Delegate) - https://mynameiskgws.tistory.com/16

 

https://ko.wikipedia.org/wiki/%EC%98%B5%EC%84%9C%EB%B2%84_%ED%8C%A8%ED%84%B4

옵저버/감시자 패턴 (Observer Pattern) 정의 / 특징

  • 관찰자(Observer)들이 관찰하고 있는 대상자(Subject)의 상태가 변경시에 대상자는 각 관찰자들에게 알림(Eventg)을 전달, 관찰자는 알림을 수신받아 변화에 대한 조치를 취하는 행동
    • 통보를 받은 관찰자가 값을 변경, 삭제, 알림 등 대응을 한다.
  • 1:N의 의존성을 가지며, 분산 이벤트 핸들링 시스템을 구현하는데 사용한다.
    • 한개의 대상자 (Subject) :  관찰자 (Observer A,B,C...)
  • 관찰 대상자(Subject) 인터페이스와 관찰자(Observer) 클래스로 구분되어 사용한다.
  • Observer들은 Subject의 그룹에서 추가/삭제가 동적으로 이루어진다.
  • 한 객체의 상태가 변경되면 다른 객체도 변경해야 할 때, 변경되는 다른 객체들이 변경되어야 하는지 몰라도 될 때

 

장점

  • 대상자의 상태 변경을 주기적으로 조회하지 않고 자동으로 감지할 수 있다.
  • Observer클래스를 추가/삭제 시 Subject의 코드를 변경하지 않기 때문에 OCP원칙을 준수하며, 느슨한 결합성을 유지한다.
  • 런타임 시점에 관계를 맺는다.
    • 프로그램 코드가 상호작용되어야하는지 확인할 때 정적으로 알 수 없으며, 명령 실행과정을 동적으로 추론해야하기 때문에 단점 일 수 있다.

단점

  • 동기적(Syncronized)이다.
    • Observer중 하나라도 느릴 경우, 대상이 블록 될 수 있다.
  • Observer를 멀티스레드, 락과 함께 사용시에는 교착상태에 빠질 수 있다.
    • 이벤트 큐를 사용하여 비동기적으로 상호작용하여 안정적으로 처리할 수 있다.
  • 알림 순서를 제어할 수 없다. 즉, 무작위 순서로 알림을 받는다.
  • 옵저버 객체를 등록 후 해지하지 않는다면, 메모리 누수가 발생할 수 있다.

 

사용 예시

  • 델리게이트(Delegate)를 사용하여 캐릭터의 체력이 변경될 경우 UI에 자동으로 반영
    • Subject : PlayerCharacter
    • Observer : UI
    • Event(Delegate) : DelegateSingature
  • 게임의 업적 기능
  • Java의 라이브러리 (java.util.Observer), C#의 Event
  • 유튜브 (채널 : Subject / 구독자 : Observer)
  • MVC패턴 (Model : Subject / View: Observer)

출처 및 참고내역

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%98%B5%EC%A0%80%EB%B2%84Observer-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90 

 

도서 - 게임 프로그래밍 패턴