공부/C#

[C#] EventHandler

min1119 2023. 11. 16. 23:19
EventHandler란?
  • 관찰자 디자인 패턴(Observer Pattern)
  • 개체에서 작업 실행을 알리기 위해 보내는 메세지
public event EventHandler MyEventHandler;

 

 개발자가 정의한 어떠한 일의 발생 순간에 (이벤트 발생) 처리하고 싶은 작업이 있는 각 개체들의 처리법을 미리 등록해두고, 이벤트 발생시 미리 등록한 함수들을 순차적으로 실행되도록 해주는 대리자 모델이다.

 

 일반적으로 이벤트 핸들러에 등록하는 함수는 다음과 같은 형식으로 설계한다.

void OnEventFunc(object sender, EventArgs s)
{
	//...
}

 

직접적으로 함수의 형태를 정하여 초기화시켜주고 싶은 경우에는 다음과 같은 대리자를 선언하는 방법을 사용할 수 있다.

public delegate void EventHandlerDelegate(object sender, EventArgs e);

 

사용자 지정된 이벤트 데이터 클래스를 만들 수도 있다. 일반적으로 이벤트 데이터 클래스 이름은 EventArgs로 끝난다.

public class CustomEventArgs : EventArgs
{
	public int Value { get; set; }
}

 

이벤트 실행을 감지(구독), 혹은 감지 취소(구독 취소)를 하기 위해서는 해당 이벤트 핸들러에 접근할 수 있는 위치에서 +=, -= 연산자를 사용한다.

처음 등록된 함수 형식에 맞춰 기본 형식이 변환되므로 제너릭한 함수 구조를 사용하는 것이 좋다.

MyEventHandler += OnEventFunc;
// ...
MyEventHandler -= OnEventFunc;

 

이벤트를 발생(등록된 함수를 모두 실행)하기 위해서는 Invoke() 함수를 사용하면 된다. 일반적으로는 EventHandler에 아무 함수가 등록되있지 않아 null일 수 있는 상황을 방지하기 위해 ?. 연산자를 사용한다. 

MyEventHandler?.Invoke(sender, args);

 

EventHandler는 자신이 선언된 클래스 내에서만 실행문을 가질 수 있기 때문에, 만약 외부에서 해당 이벤트를 실행시키고 싶다면 래핑해서 제공해주어야 한다.

public void OnEventTrigger(object sender, EventArgs e)
{
	MyEventHandler?.Invoke(sender, e);
}

 

여기까지 EventHandler에 대한 대략적인 구조와 사용 방법을 알아보았다.

예제를 통해 이벤트 핸들러의 구현 및 구동 장면을 보고 싶다면 다음 글을 참고 바란다.

2023.11.17 - [C#] - [C#] EventHandler 예제

'공부 > C#' 카테고리의 다른 글

[C#] EventHandler 예제 <ThunderboltEvent>  (1) 2023.11.17
[C#] GetHashCode()  (0) 2023.11.10
[C#] Unix Timestamp  (0) 2023.11.06
[C#] Enum.IsDefined  (0) 2023.11.04