C#에서 이벤트는 클래스나 객체가 다른 클래스나 객체에 대한 통지를 보내는 데 사용됩니다.
이는 객체 지향 프로그래밍에서 중요한 개념 중 하나이며, 특히 이벤트 기반 프로그래밍에서 매우 유용하게 사용됩니다.
또한 이벤트는 특수한 형태의 delegate 입니다.
이벤트의 추가(+=) 및제거(-=)만 가능하고 할당이 불가능합니다. ( = 로 이벤트 할당 불가)
객체에 특정 작업의 실행을 알리는 메시지, 예를 들면 사용자와의 인터랙션(Interaction)과 같은 처리를 말합니다.
ex) 버튼을 터치했을 경우나 속성값 변경 등의 사건.
이벤트는 일반적으로 Delegate model을 기반으로 하며, 이는 관찰자 디자인 패턴(Observer Design Pattern)을 따릅니다.
(Observer Design Pattern : 구독자(Subscriber)가 공급자(Provider)를 등록하고 공급자로부터 알림을 수신하는데 사용)
[이벤트의 구성요소]
- 이벤트 발생자 (Event Publisher): 이벤트를 발생시키는 클래스 또는 객체입니다. 이벤트 발생자는 이벤트를 정의하고, 이벤트가 발생했을 때 이를 처리할 수 있는 메서드(이벤트 핸들러)를 호출합니다.
- 이벤트 구독자(Event Subscriber): 이벤트를 수신하고 처리하는 클래스 또는 객체입니다. 이벤트 구독자는 이벤트 핸들러를 등록하여 이벤트 발생 시 이를 처리합니다.
[이벤트 선언 및 사용]
<이벤트 선언>
이벤트는 event 키워드를 사용하여 선언됩니다. 일반적으로 이벤트의 이름은 '이벤트 발생자에 대한 동사 + "ed" 접미사'의 형태를 가집니다.
public event EventHandler MyEvent;
<이벤트 발생자에서 이벤트 호출>
이벤트를 발생시키는 코드는 이벤트가 발생했음을 알리기 위해 이벤트를 호출합니다. 일반적으로 이벤트 핸들러를 호출하는 메서드를 정의합니다.
public class EventPublisher
{
public event EventHandler MyEvent;
public void RaiseEvent()
{
OnMyEvent(EventArgs.Empty);
}
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
<이벤트 핸들러 등록>
이벤트 핸들러를 등록하려면 이벤트 발생자의 이벤트에 대한 핸들러를 추가합니다.
public class EventSubscriber
{
public void Subscribe(EventPublisher publisher)
{
publisher.MyEvent += EventHandlerMethod;
}
private void EventHandlerMethod(object sender, EventArgs e)
{
// 이벤트 처리 로직 작성
}
}
<이벤트 핸들러 제거>
이벤트 핸들러를 제거하려면 이벤트 발생자의 이벤트에 대한 핸들러를 제거합니다.
public class EventSubscriber
{
public void Unsubscribe(EventPublisher publisher)
{
publisher.MyEvent -= EventHandlerMethod;
}
private void EventHandlerMethod(object sender, EventArgs e)
{
// 이벤트 처리 로직 작성
}
}
이벤트를 사용하는 예제를 살펴보겠습니다.
using System;
public class EventPublisher
{
public event EventHandler MyEvent;
public void RaiseEvent()
{
OnMyEvent(EventArgs.Empty);
}
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
public class EventSubscriber
{
public void Subscribe(EventPublisher publisher)
{
publisher.MyEvent += EventHandlerMethod;
}
public void Unsubscribe(EventPublisher publisher)
{
publisher.MyEvent -= EventHandlerMethod;
}
private void EventHandlerMethod(object sender, EventArgs e)
{
Console.WriteLine("Event handled!");
}
}
class Program
{
static void Main()
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
// 이벤트 핸들러 등록
subscriber.Subscribe(publisher);
// 이벤트 발생
publisher.RaiseEvent(); // 출력: Event handled!
// 이벤트 핸들러 제거
subscriber.Unsubscribe(publisher);
}
}
이벤트를 사용하는 간단한 코드를 하나 더 보겠습니다.
class Program
{
static void Main(string[] args)
{
var button = new MyButton();
// 3. eventhandler에 이벤트 추가
button.Click += new EventHandler(BtnClick);
// 4. 이벤트 발생을 위한 함수 호출
button.MouseButtonDown();
}
// 2. eventhandler에 추가할 형식에 맞는 event 함수 선언
static void BtnClick(object sender, EventArgs e)
{
Console.WriteLine("button clicked!");
}
}
public class MyButton
{
// 1. event 선언
public event EventHandler Click;
public void MouseButtonDown()
{
if (this.Click != null)
{
// 5. 이벤트 발생
Click(this, EventArgs.Empty);
}
}
}
이벤트에 대해 요약해보면
- 이벤트의 추가(+=) 및제거(-=)만 가능하고 할당이 불가능합니다. ( = 로 이벤트 할당 불가)
- 이벤트는 이벤트 발생자에서 발생하고, 이를 구독하는 이벤트 구독자에서 처리됩니다.
- 이벤트는 event 키워드를 사용하여 선언되며, EventHandler 델리게이터를 주로 사용합니다.
- 이벤트 핸들러 등록 및 제거를 통해 이벤트를 관리할 수 있습니다.
- 클래스 외부에서 직접 이벤트를 호출할 수 없습니다.
'C# > 프로그래밍 고급' 카테고리의 다른 글
C# 프로그래밍 고급 - 12. 익명 객체 (0) | 2024.05.30 |
---|---|
C# 프로그래밍 고급 - 11. Linq (0) | 2024.05.30 |
C# 프로그래밍 고급 - 09. 델리게이터 응용 (2) | 2024.05.30 |
C# 프로그래밍 고급 - 08. 델리게이터 종류 (1) | 2024.05.30 |
C# 프로그래밍 고급 - 07. 람다식 (0) | 2024.05.30 |