옵저버 (Observer) 패턴은 Subject (주체)에 의해 모든 Observer (관찰자) 에게 알림을 보내는 디자인 패턴입니다.
우리가 자주 보는 유튜브에서도 유튜버와 그 유튜버를 구독한 사람과의 관계에서도 옵저버 패턴의 예를 찾아볼 수 있습니다.
구독자가 유튜버의 알림을 받는다면 유튜버가 영상 올릴 때 알림을 받는 모든 구독자에게 알림이 전달됩니다.
여기서 유튜버는 Subject, 구독자는 Observer라고 볼 수 있습니다.
- Subject (주체) 는 모든 Observer에게 알림을 전달합니다.
- Observer (관찰자) 는 Subject 가 보낸 알림을 수신합니다.
구현
위 예시를 기반으로 코드를 짜보겠습니다.
Subscriber (Observer)
public interface IObserver
{
void Notify(string message);
}
우선 Observer를 가진 객체인지 구분하기 위해 IObserver 인터페이스를 만듭니다.
Notify 안에 매개변수는 유튜버를 구독한 구독자들에게 전달할 정보입니다.
public abstract class SubscriberBase : MonoBehaviour, IObserver
{
public abstract void Notify(string message);
}
public class Subscriber1 : SubscriberBase
{
public override void Notify(string message)
{
Debug.Log($"공지사항: {message}, Subscriber1");
}
}
public class Subscriber2 : SubscriberBase
{
public override void Notify(string message)
{
Debug.Log($"공지사항: {message}, Subscriber2");
}
}
그 다음에 IObserver를 상속받는 추상화 클래스를 만들어서 다시 추상화 클래스를 상속받는 구독자 (Observer)들을 만들어줍니다.
그리고 Notify 안에는 유튜버 (Subject)가 알림을 보내면 어떤 코드를 실행할지 로직을 만들어줍니다.
public class SubscriberWithoutAbstract : MonoBehaviour, IObserver
{
public void Notify(string message)
{
Debug.Log($"공지사항: {message}, Subscriber1");
}
}
추상화 클래스를 안 만들고 위 코드처럼 바로 IObserver를 상속받아도 됩니다.
Youtuber (Subject)
public interface ISubject
{
void Subscribe(IObserver observer);
void Unsubscribe(IObserver observer);
void NotifyObservers(string message);
}
다음은 알림을 전달할 유튜버 (Subject) 입니다.
우선 ISubject 인터페이스 안에 Subscribe, Unsubscribe가 있는데
Subscribe를 하면 구독을 해서 알림이 가고 Unsubscribe는 구독 해지해서 알림이 가지 않습니다.
NotifyObservers는 구독한 모든 구독자 (Observer)에게 알림이 가는 함수입니다.
public class Subject : ISubject
{
private List<IObserver> observers = new();
public void Subscribe(IObserver observer)
{
observers.Add(observer);
}
public void Unsubscribe(IObserver observer)
{
observers.Remove(observer);
}
public void NotifyObservers(string message)
{
foreach (var observer in observers)
{
observer.Notify(message);
}
}
}
ISubject를 상속받은 클래스에서 구체화를 해줍니다.
observers 리스트에는 구독한 구독자들을 저장합니다.
NotifyObservers에는 observers 안에 있는 모든 observer의 Notify 함수를 실행합니다.
public class NoticeManager : MonoBehaviour
{
[SerializeField]
private List<SubscriberBase> subscribers = new();
private Subject youtuber;
private void Awake()
{
youtuber = new Subject();
}
private void Start()
{
foreach (var subscriber in subscribers)
{
youtuber.Subscribe(subscriber);
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
youtuber.NotifyObservers("새로운 영상 업데이트");
}
}
private void OnDestroy()
{
foreach (var subscriber in subscribers)
{
youtuber.Unsubscribe(subscriber);
}
}
}
위 코드는 유튜버 (Subject)와 구독자 (Observer) 들을 연결시키는 코드입니다.
여기서 Subject인 youtuber에 있는 NotifyObservers를 통해 모든 구독자들에게 알림을 보낼 수 있습니다.



아까 구독자들은 MonoBehaviour를 상속받았으므로 오브젝트를 만들어주고 해당 오브젝트에 스크립트를 넣어줍니다

그 다음에 또 다른 오브젝트를 만들어서 NoticeManager를 넣어줍니다.
리스트에는 구독자 오브젝트들을 넣어줍니다.

아까 저는 Input.GetKeyDown(KeyCode.Space) 를 통해 NotifyObservers 를 실행했기 때문에 스페이스바를 누르면 모든 구독자들에게 알림이 가는 걸 확인할 수 있습니다.
여담
위 예제는 굳이 유니티가 아니더라도 만들 수 있는 예제입니다.
너무 유튜브에 치중된 비유를 보여드렸는데 원래 유니티에선 아래 예시와 같은 경우에 사용합니다.
- Player가 공격 받아서 HP가 감소하면 HP 체력바 업데이트
- 4인 멀티 게임을 예로 들면 한 명이 죽을 경우 서버에서 그 플레이어가 죽었다고 모든 플레이어에게 알림
- 여러 가지 사유로 인해 플레이어가 죽을 시 게임 오버 처리 등등
1:N 관계에서 자주 쓰이는 것 같습니다.
'유니티 > Tutorial' 카테고리의 다른 글
| Unity Fishnet[0] 소개 및 설치 (0) | 2025.06.24 |
|---|---|
| Unity 디자인 패턴 Command (2) | 2025.05.28 |
| Unity 디자인 패턴 Singleton (0) | 2025.04.07 |
| Unity Compute Shader (0) | 2025.03.22 |
| Unity New Input System (0) | 2025.02.19 |