본문 바로가기

프로그래밍&IT/기타

(2) Event 발행 (Publisher), 구독(Subscriber) 패턴에 대해서

저번 시간에 이어서 이벤트 발행 & 구독 패턴의 C# 실제 예제를 간단히 알아본다.

 

이전 포스팅

2024.10.13 - [프로그래밍&IT/기타] - (1) Event 발행 (Publisher), 구독(Subscriber) 패턴에 대해서

 

 

C#에서 이벤트(Event)를 발행하고 구독하는 방식은 event와 delegate를 사용하여 구현할 수 있습니다.

1. 이벤트 발행 및 구독 구조

  • Publisher: 이벤트를 발행하는 클래스
  • Subscriber: 이벤트를 구독하는 클래스
using System;

namespace EventExample
{
    // 이벤트를 위한 Delegate 선언
    public delegate void NotifyEventHandler(string message);

    // 이벤트 발행 클래스 (Publisher)
    public class Publisher
    {
        // 이벤트 선언
        public event NotifyEventHandler Notify;

        // 이벤트를 트리거하는 메서드
        public void RaiseEvent(string message)
        {
            if (Notify != null) // 구독자가 있을 때만 이벤트 호출
            {
                Notify(message);
            }
        }
    }

    // 이벤트 구독 클래스 (Subscriber)
    public class Subscriber
    {
        private string _name;

        public Subscriber(string name)
        {
            _name = name;
        }

        // 이벤트 핸들러 메서드
        public void OnNotify(string message)
        {
            Console.WriteLine($"{_name} received message: {message}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Publisher 생성
            Publisher publisher = new Publisher();

            // Subscriber 생성 및 구독 설정
            Subscriber subscriber1 = new Subscriber("Subscriber 1");
            Subscriber subscriber2 = new Subscriber("Subscriber 2");

            publisher.Notify += subscriber1.OnNotify; // subscriber1이 이벤트 구독
            publisher.Notify += subscriber2.OnNotify; // subscriber2도 구독

            // 이벤트 발행
            publisher.RaiseEvent("Hello, Subscribers!");

            // 구독 해제
            publisher.Notify -= subscriber2.OnNotify;

            // 이벤트 발행 (subscriber2는 메시지를 받지 않음)
            publisher.RaiseEvent("Goodbye, Subscribers!");
        }
    }
}

 

 

2. 내용에 대해서

 

  • Delegate 선언: NotifyEventHandler는 이벤트 핸들러 메서드를 정의하는 대리자입니다. 이 대리자는 string 매개변수를 받고, 반환 값이 없는 메서드를 참조합니다.
  • Publisher 클래스: Publisher 클래스는 이벤트를 선언하고, RaiseEvent 메서드를 통해 이벤트를 트리거합니다. Notify 이벤트는 NotifyEventHandler 대리자를 통해 정의되었습니다.
  • Subscriber 클래스: Subscriber 클래스는 이벤트를 구독하고, 이벤트가 발생하면 OnNotify 메서드가 호출됩니다. 각 구독자는 자신의 이름과 함께 메시지를 출력합니다.
  • 이벤트 구독 및 발행: Main 메서드에서 두 명의 구독자를 생성하고, 각 구독자가 이벤트를 구독하도록 설정합니다. 이후 이벤트를 두 번 발행하며, 두 번째 발행에서는 한 구독자를 해제한 후 메시지를 받지 않게 됩니다.