Click이라는 Event가 있다면, Event는 Eventhandler를 가져야 한다.
그 Event가 발생했을 때, 어떻게 처리될지 정의를 Handler가 가지고 있으니까.
결국
Click이라는 Event가 있다면, 우리는 Click += new EventHandler...
와 같이, Click이라는 Event에 그에 맞는 handler를 넣어 줄 것이다.
--------------------------------------------------------------------
EventHandler 란? - Event를 어떻게 다룰지 정의한 함수(메소드)를 가리키는 함수포인터.
(C언어) : 함수 포인터를 만들어주되, 함수 포인터 이름 자체를 하나의 Type으로
사용할 수 있도록 typedef 키워드를 함께 사용 한다.
typedef void (*EventHandler)(void)
EventHandler handler; // EventHandler 타입의 변수
--------------------------------------------------------------------
C#에서 EventHandler를 만들고, Event를 만들어서 사용해보자.
(1)
C#에서는 아래와 같이 편리하게 Handler를 만들 수 있다.
delegate void EventHandler(void);
C언어의 코드와 비교해보면, 포인터 개념이 없고 Ref 개념이기 때문에,
'*' 는 사용하지 않고, typedef 를 써주는 대신 delegate만 사용해줬을 뿐이다.
(2)
이제, EventHandler(함수, 메소드 포인터) 타입을 정의하였으니, 아래와 같이
Handler를 사용할 수 있다.
delegate void EventHandler(void);
EventHandler handle = new EventHandler();
(3)
이제, Event를 만들어보자.
Event는 맨 위에서 말했던 것 처럼, event가 발생했을 때, 어떤 로직이 처리될지
그 로직을 정의해놓은 함수(메소드)를 바로 호출할 수 있도록, 그 로직을 포함하는
메소드를 가리키고 있는 함수포인터 값을 가지고 있어야 한다.
event = handler 메소드의 포인터 값.
즉, Event는 handler 값을 가질 수 있어야 함으로,
event자체의 타입은 EventHandler 타입이 될 것이다.
여기서, C#에서는 이 녀석이 Handler 자체를 말하려고 한 것인지, 아니면
Event 이고 값만 handler 를 갖으려고 하는 것인지 구분 할 수 있어야 한다.
event 키워드를 사용한다.
class Foo
{
event EvenHandler Click;
Operator+=(EventHandler ev)
{
this.Click = &ev;
}...
};
이제 우리가 흔히 보던 Event 추가하는 코드를 작성 해보면,
-------------------------
void Mouse_Click(void){ cout << "Hello World" <<endl; }
Foo mouse;
mouse.Click += new EventHandler(Mouse_Click);
이제 위와 같이 해주면,
Click 이라는 이벤트가 발생했을 때, Mouse_Click 메소드가 실행되고,
그 내의 로직이 실행 될 것이다.
--------------------------------------------------------------------
* 정리 *
1. c#에서는 event, eventHandler라는 개념이 있다.
event : 특정 사건
eventHandler : 특정 사건에 대한 로직.
(특정 사건이 발생했을 때, 처리해야할 로직이 담긴 메소드의 포인터.)
2. EventHandler는 결국 함수 포인터이다.
(typedef void (*EventHandler)(void) == delegate void EventHandler(void) )
3. Event는 event 키워드를 사용하며, EventHandler타입으로 정의된다.
event EventHandler Click;
4. event에 += 연산자 오버로딩 메소드를 통해, 핸들러를 추가해주면 된다.