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에 대한 대략적인 구조와 사용 방법을 알아보았다.
예제를 통해 이벤트 핸들러의 구현 및 구동 장면을 보고 싶다면 다음 글을 참고 바란다.
'공부 > 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 |