C# event

C#에서 EventEventArgs는 이벤트를 다룰 때 함께 사용되지만 그 역할이 다릅니다.

1. Event (이벤트)

  • 정의: Event는 객체 간의 통신을 위한 메커니즘입니다. 클래스의 상태가 변경될 때 다른 객체에게 알림을 보내는 데 사용됩니다.
  • 역할: 특정 동작(예: 버튼 클릭, 데이터 변경 등)이 발생했을 때 구독자(Subscriber) 메서드를 호출하기 위해 사용됩니다.
  • 형태: event 키워드를 사용해서 이벤트를 선언합니다.

예시 코드:

using System;

public class Publisher
{
    // 이벤트 선언
    public event EventHandler MyEvent;

    public void RaiseEvent()
    {
        Console.WriteLine("이벤트를 발생시킵니다.");
        MyEvent?.Invoke(this, EventArgs.Empty); // 이벤트 발생
    }
}

public class Subscriber
{
    public void HandleEvent(object sender, EventArgs e)
    {
        Console.WriteLine("이벤트를 수신했습니다.");
    }
}

class Program
{
    static void Main()
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        // 이벤트 구독
        pub.MyEvent += sub.HandleEvent;

        pub.RaiseEvent(); // 이벤트 발생
    }
}

출력:

이벤트를 발생시킵니다.
이벤트를 수신했습니다.

2. EventArgs

  • 정의: EventArgs는 이벤트에 전달할 데이터를 담는 기반 클래스입니다.
  • 역할: 이벤트 핸들러에 추가 정보(데이터)를 전달할 때 사용됩니다. 만약 이벤트에 전달할 정보가 없다면 EventArgs.Empty를 사용할 수 있습니다.
  • 확장: 대부분의 경우 EventArgs를 상속받아 사용자 정의 이벤트 데이터 클래스를 만듭니다.

사용자 정의 EventArgs 예시:

using System;

public class MyEventArgs : EventArgs
{
    public string Message { get; }

    public MyEventArgs(string message)
    {
        Message = message;
    }
}

public class Publisher
{
    public event EventHandler<MyEventArgs> MyCustomEvent;

    public void RaiseEvent()
    {
        Console.WriteLine("이벤트를 발생시킵니다.");
        MyCustomEvent?.Invoke(this, new MyEventArgs("이벤트 데이터 전달"));
    }
}

public class Subscriber
{
    public void HandleEvent(object sender, MyEventArgs e)
    {
        Console.WriteLine($"이벤트 수신: {e.Message}");
    }
}

class Program
{
    static void Main()
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        // 이벤트 구독
        pub.MyCustomEvent += sub.HandleEvent;

        pub.RaiseEvent(); // 이벤트 발생
    }
}

출력:

이벤트를 발생시킵니다.
이벤트 수신: 이벤트 데이터 전달

차이점 요약

| 구분 | Event (이벤트) | EventArgs | |—————–|——————————————————|—————————————-| | 역할 | 이벤트를 정의하고 발생시키는 메커니즘 | 이벤트 핸들러에 전달할 데이터를 담는 객체 | | 사용법 | event 키워드를 사용해서 선언 | 이벤트 핸들러에 EventArgs를 전달 | | 확장성 | 확장 불가능 (이벤트 자체는 정의된 형태로 사용) | EventArgs를 상속하여 커스텀 가능 | | 예시 | public event EventHandler MyEvent; | public class MyEventArgs : EventArgs |


정리

  • Event: 이벤트를 선언하고 구독자에게 알림을 보내는 기능을 제공.
  • EventArgs: 이벤트 발생 시 전달할 데이터를 담는 컨테이너.
    EventArgs를 확장하여 사용자 정의 이벤트 데이터를 만들 수 있습니다.