일단 이벤트의 작동은 다음과 같다. 이벤트와 이벤트 핸들러는 닷넷에서 객체 또는 컴포넌트가 특정 상황에서 알림을 받기 위해서 사용하는 메커니즘이다. 이벤트 핸들러는 이러한 이벤트가 발생했을 때 호출되는 메서드를 참조한다. 이벤트 핸들러 대리자는 이벤트 핸들러 메서드의 시그니쳐 ( 매개변수와 반환타입 )을 정의 한다.
닷넷에서는 표준 이벤트 패턴을 따르기 위해서 EventHandler 또는 EventHandler 대리자를 사용한다. 여기서 TEventArgs는 이벤트와 함께 전달되는 추가 데이터를 담는 클래스이다. EventArgs 클래스를 상속받아 필요한 데이터를 포함시킬 수 있다.
EventHandler는 추가 데이터가 필요 없는 경우에 사용한다.
EventHandler는 이벤트와 함께 추가 데이터를 전달할 때 사용한다.
제일 어려운 게 이벤트 핸들러 구현 같다.
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));
//};
public void PublishMessage(string message)
{
// 이벤트에 등록된 핸들러가 있으면 이벤트 발생
messagePublished?.Invoke(this, new MessageEventArgs(message));
}
}
// 이벤트를 구독하고 처리할 클래스를 구현한다. 이 클래스는 이벤트 핸들러 메서드를 정의하고, publisher 클래스의 인스턴스에 이 메서드를 이벤트 핸들러로 등록한다.
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
publisher.messagePublished += OnMessagePublished; // 이벤트핸들러 목록에 추가 삭제는 당연히 -
}
private void OnMessagePublished(object? sender, MessageEventArgs e)
{
Console.Write($"Message received : {e.Message}");
}
}
}