이벤트핸들러 대리자 자세히

냐옹·2024년 4월 9일
0

.NET

목록 보기
3/31

이벤트핸들러 대리자 자세히

일단 이벤트의 작동은 다음과 같다. 이벤트와 이벤트 핸들러는 닷넷에서 객체 또는 컴포넌트가 특정 상황에서 알림을 받기 위해서 사용하는 메커니즘이다. 이벤트 핸들러는 이러한 이벤트가 발생했을 때 호출되는 메서드를 참조한다. 이벤트 핸들러 대리자는 이벤트 핸들러 메서드의 시그니쳐 ( 매개변수와 반환타입 )을 정의 한다.

  1. 닷넷에서는 표준 이벤트 패턴을 따르기 위해서 EventHandler 또는 EventHandler 대리자를 사용한다. 여기서 TEventArgs는 이벤트와 함께 전달되는 추가 데이터를 담는 클래스이다. EventArgs 클래스를 상속받아 필요한 데이터를 포함시킬 수 있다.

  2. EventHandler는 추가 데이터가 필요 없는 경우에 사용한다.

  3. EventHandler는 이벤트와 함께 추가 데이터를 전달할 때 사용한다.

  4. 제일 어려운 게 이벤트 핸들러 구현 같다.
    namespace ConsoleApp2
    {
    internal class Program
    {
    static void Main(string[] args)
    {
    var publisher = new Publisher();
    var subscriber = new Subscriber();

            // 구독자가 이벤트 구독
            subscriber.Subscribe(publisher);
    
            // 메시지 발행
            publisher.PublishMessage("Hello, World!");
    
        }
    }
    
    // 이벤트와 함께 전달할 데이터를 포함하는 클래스를 EventArgs를 상속받아서 정의한다.
    public class MessageEventArgs : EventArgs
    {
        public string Message { get; }
    
        public MessageEventArgs(string message)
        {
            this.Message = message;
        }
    }
    
    // 다음으로는 이벤트를 정의하고 발생시키는 클래스를 만든다. 
    // 이 클래스는 이벤트를 공개적으로 선언하고, 이벤트가 발생할 조건을 만족시키는 메서드에서 이벤트를 발생시킨다.
    public class Publisher
    {
        public event EventHandler<MessageEventArgs> messagePublished;
    
        // 이벤트를 발생시키는 메서드
        //Action<string> PublishMessage2 = (message) =>
        //{
        //    messagePublished?.Invoke(this, new MessageEventArgs(message));

     근데 요즘은 Invoke 잘 안쓰고 그냥 참조주소로 호출해버림 ( 굳이 쓸필요가 없음 )
    //};
    public void PublishMessage(string message)
    {
    // 이벤트에 등록된 핸들러가 있으면 이벤트 발생
    messagePublished?.Invoke(this, new MessageEventArgs(message));
    }
    }

    // 이벤트를 구독하고 처리할 클래스를 구현한다. 이 클래스는 이벤트 핸들러 메서드를 정의하고, publisher 클래스의 인스턴스에 이 메서드를 이벤트 핸들러로 등록한다. 
    public class Subscriber
    {
    // 구독했을 때 Publisher의 이벤트핸들러에 이벤트를 추가한다. 
        public void Subscribe(Publisher publisher)
        {
            publisher.messagePublished += OnMessagePublished; // 이벤트핸들러 목록에 추가 삭제는 당연히 -
        }
    
        private void OnMessagePublished(object? sender, MessageEventArgs e)
        {
            Console.Write($"Message received : {e.Message}");
        }
    }

    }
    그러니까 정리하면 이 순서임
    먼저 이벤트에서 왔다리 갔다리 할 덩어리(개체)를 정의한다. 이건 EventArgs를 상속받아서 커스터마이징하면 된다. 그리고 나서 구독자와 작가가 위에 있는데 먼저 작가를 정의해야 한다. 작가 안에다가 그 덩어리(개체)를 다루는 이벤트핸들러를 정의해준다음에 그 이벤트 핸들러를 호출하는 메서드를 만든다.
    이후에 파생되는 클래스를 만드는데 그게 구독자다. 구독자가 하는 행동, 구독을 메서드로 만들고, 구독했을 때 할 행동(로직)을 정의한다. 그리고 아까 만든 구독이라는 행동에 해당하는 메서드에 구독했을 때 할 행동을 정의한 메서드의 참조를 작가의 이벤트 핸들러 자체에 추가해준다.

이번에는 몇가지 테마를 토대로 더 살펴보자.
좋은 블로그를 찾았다. 공돌창고 :: C#/.NET 구조체(struct)와 클래스(class) 차이 (tistory.com)

0개의 댓글

Powered by GraphCDN, the GraphQL CDN