이번 포스팅은 저번 포스팅에 이어 이벤트에 관한 내용입니다.
이벤트 발생에 대한 내용보다 정의와 등록에 대한 내용을 먼저 했어야 했는데 거꾸로 됐네요ㅎㅎ
이벤트 발생에 대한 내용은 아래 글에서 확인하실 수 있습니다.
https://wjunsea.tistory.com/135
| 이벤트 정의
- 이벤트는 C# 언어에서 특정 상황, 조건이 발생했을 때 이벤트 핸들러에게 알리는 메커니즘입니다.
- 특정 조건이 충족될 때 호출되며, 예를 들어 GUI 요소에서 버튼 클릭, 마우스 이동 등 이벤트 발생
예시) 이벤트 델리게이트 정의
public event EventHandler MyEvent;
- 이벤트를 정의할 때는 해당 이벤트를 처리하는 delegate 형식을 정의해야 합니다.
이벤트 델리게이트는 이벤트 핸들러 메서드의 명과 일치해야 하며
주로 사용되는 이벤트 델리게이트는 'EventHandler'와 'EventHandler<TEventArgs>'가 있습니다.
- 'EventHandler' : 이벤트 인수가 없을 때 사용
- 'EventHandler<TEventArgs>' : 이벤트 인수를 가지는 경우 사용
- 위 코드에서 MyEvent는 EventHandler' 델리게이틀르 사용하여 이벤트를 정의하고 있습니다.
- 그리고 이벤트를 클래스 내에서 정의할 때는 'event' 키워드를 사용하여 정의합니다.
'event' 키워드를 사용하면 이벤트를 클래스 외부에서도 접근할 수 있도록 만듭니다.
| 이벤트 등록
- 이벤트 등록은 EventHandler를 evnet에 연결하는 과정을 의미합니다.
이벤트가 발생하면 연결된 핸들러가 실행되며 이벤트 등록은 다음과 같은 방법으로 이루어집니다.
- 이벤트 핸들러 메서드 정의 :
- 이벤트 핸들러 메서드는 이벤트가 발생했을 때 실행되는 메서드
- 메서드는 이벤트 델리게이트와 동일한 이름을 가져야 함 - 이벤트 핸들러 메서드를 이벤트에 연결 :
- 이벤트를 발생시키는 객체에서 이벤트 핸들러 메서드를 이벤트에 연결 > 이벤트 등록
- 이벤트가 발생하면 연결된 핸들러 메서드가 실행
예시) 이벤트 등록
public class MyEventPublisher
{
public event EventHandler MyEvent;
public void RaiseEvent()
{
// 이벤트 핸들러가 등록되어 있는지 확인하고 호출
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
public class Program
{
static void MyEventHandler(object sender, EventArgs e)
{
Console.WriteLine("이벤트가 처리되었습니다.");
}
static void Main()
{
MyEventPublisher publisher = new MyEventPublisher();
// 이벤트 핸들러를 이벤트에 등록
publisher.MyEvent += MyEventHandler;
// 이벤트를 발생시킴
publisher.RaiseEvent();
}
}
| 이벤트 제거
- 이벤트 제거는 이벤트 핸들러와 연결을 해제하는 과정입니다.
이벤트가 특정 호출하지 않도록 만들며 다음과 같은 방법으로 이루어집니다.
- 이벤트 핸들러 연결 해제 :
- 이벤트를 발생시키는 객체에서 이벤트 핸들러를 이벤트에서 연결을 해제합니다.
예시) 이벤트 제거 코드
public class Program
{
static void MyEventHandler(object sender, EventArgs e)
{
Console.WriteLine("이벤트가 처리되었습니다.");
}
static void Main()
{
MyEventPublisher publisher = new MyEventPublisher();
// 이벤트 핸들러를 이벤트에 등록
publisher.MyEvent += MyEventHandler;
// 이벤트를 발생시킴
publisher.RaiseEvent();
// 이벤트 핸들러를 이벤트에서 제거
publisher.MyEvent -= MyEventHandler;
// 다시 이벤트를 발생시켜도 MyEventHandler는 호출되지 않음
publisher.RaiseEvent();
}
}
- 위 코드에서 MyEventHandler가 MyEvent 이벤트에 등록되었으며
나중에 publisher.MyEvent -= MyEventHandler를 사용하여 이벤트에서 제거됩니다.
이후에 publisher.RaiseEvent()를 호출해도 MyEventhandler는 호출되지 않게 됩니다.
| 마무리
- 이벤트 정의와 등록 및 제거를 사용하여 이벤트 기반 프로그래밍을 하게 되면
객체 간의 효과적인 통신과 이벤트 기반 아키텍처를 구현할 수 있습니다.
이번 포스팅이 많은 도움이 되셨길 바라면서
틀린 점이나 질문이 있으시면 댓글로 남겨주세요!
다음 포스팅으로 찾아오겠습니다.
감사합니다 :)
'C#' 카테고리의 다른 글
C# 비동기 프로그래밍 : Task 이해 (0) | 2023.11.16 |
---|---|
C# 멀티캐스트 이벤트 이해 : 다중 이벤트 핸들러 관리 (0) | 2023.11.02 |
C# 이벤트 발생 (Event Raising) 이해 (0) | 2023.10.31 |
자동 구현 속성 이해 (Auto-implemented Properties) (0) | 2023.10.30 |
[C#] CancellationToken 이해 (0) | 2023.10.25 |