C#

C# 이벤트 정의와 등록 및 제거 방법

우준세 2023. 11. 1. 11:23
728x90
반응형

 

이번 포스팅은 저번 포스팅에 이어 이벤트에 관한 내용입니다.

이벤트 발생에 대한 내용보다 정의와 등록에 대한 내용을 먼저 했어야 했는데 거꾸로 됐네요ㅎㅎ

 

이벤트 발생에 대한 내용은 아래 글에서 확인하실 수 있습니다.

 

https://wjunsea.tistory.com/135

 

C# 이벤트 발생 (Event Raising) 이해

이번 포스팅은 C#에서 이벤트를 어떻게 정의하고 발생시키는지에 대해 알아보겠습니다. | 이벤트란? - 이벤트(Event) : 객체 또는 클래스에서 발생하는 상황, 조건을 나타내며 다른 부분(이벤트 핸

wjunsea.tistory.com


| 이벤트 정의

- 이벤트는 C# 언어에서 특정 상황, 조건이 발생했을 때 이벤트 핸들러에게 알리는 메커니즘입니다.

- 특정 조건이 충족될 때 호출되며, 예를 들어 GUI 요소에서 버튼 클릭, 마우스 이동 등 이벤트 발생

 

예시) 이벤트 델리게이트 정의

public event EventHandler MyEvent;

 

- 이벤트를 정의할 때는 해당 이벤트를 처리하는 delegate 형식을 정의해야 합니다.

이벤트 델리게이트는 이벤트 핸들러 메서드의 명과 일치해야 하며 

주로 사용되는 이벤트 델리게이트는 'EventHandler'와 'EventHandler<TEventArgs>'가 있습니다.

-  'EventHandler' : 이벤트 인수가 없을 때 사용 

-  'EventHandler<TEventArgs>' : 이벤트 인수를 가지는 경우 사용

- 위 코드에서 MyEvent는 EventHandler' 델리게이틀르 사용하여 이벤트를 정의하고 있습니다.

 

- 그리고 이벤트를 클래스 내에서 정의할 때는 'event' 키워드를 사용하여 정의합니다.

'event' 키워드를 사용하면 이벤트를 클래스 외부에서도 접근할 수 있도록 만듭니다.


| 이벤트 등록

- 이벤트 등록은 EventHandler를 evnet에 연결하는 과정을 의미합니다.

이벤트가 발생하면 연결된 핸들러가 실행되며 이벤트 등록은 다음과 같은 방법으로 이루어집니다.

 

  1. 이벤트 핸들러 메서드 정의 :
    - 이벤트 핸들러 메서드는 이벤트가 발생했을 때 실행되는 메서드
    - 메서드는 이벤트 델리게이트와 동일한 이름을 가져야 함 
  2. 이벤트 핸들러 메서드를 이벤트에 연결 :
    - 이벤트를 발생시키는 객체에서 이벤트 핸들러 메서드를 이벤트에 연결 > 이벤트 등록
    - 이벤트가 발생하면 연결된 핸들러 메서드가 실행 

예시) 이벤트 등록

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();
    }
}

| 이벤트 제거

- 이벤트 제거는 이벤트 핸들러와 연결을 해제하는 과정입니다.

이벤트가 특정 호출하지 않도록 만들며 다음과 같은 방법으로 이루어집니다.

 

  1. 이벤트 핸들러 연결 해제 :
    - 이벤트를 발생시키는 객체에서 이벤트 핸들러를 이벤트에서 연결을 해제합니다.

예시) 이벤트 제거 코드

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는 호출되지 않게 됩니다.


| 마무리

- 이벤트 정의와 등록 및 제거를 사용하여 이벤트 기반 프로그래밍을 하게 되면 

객체 간의 효과적인 통신과 이벤트 기반 아키텍처를 구현할 수 있습니다.

 

이번 포스팅이 많은 도움이 되셨길 바라면서

틀린 점이나 질문이 있으시면 댓글로 남겨주세요!

 

다음 포스팅으로 찾아오겠습니다.

 

감사합니다 :)

 

 

 

728x90
반응형