디자인패턴
[디자인 패턴] 옵저버 패턴 (Observer Pattern)
KimGeon-U
2025. 2. 28. 20:36
언리얼 프로젝트를 진행하며, 느슨한 결합을 유지하기위해 델리게이트를 사용하게 되었습니다.
델리게이트를 사용 하던 중, 델리게이트는 기존에 학습하였던 옵저버 패턴(Observer Pattern)을 사용한 것 같다고 느껴졌습니다.
이를 기반으로 옵저버패턴의 정의와 특징 그리고 게임 클라이언트 환경에서 옵저버 패턴을 적용한 경우들에 대해 알아보겠습니다.
※ 델리게이트 (Delegate) - https://mynameiskgws.tistory.com/16
옵저버/감시자 패턴 (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)
출처 및 참고내역
도서 - 게임 프로그래밍 패턴