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에 += 연산자 오버로딩 메소드를 통해, 핸들러를 추가해주면 된다.

'C,C++,C#' 카테고리의 다른 글

[c#] Serialization, Deserialization (직렬화, 역직렬화)  (0) 2016.09.06
블로그 이미지

kuku_dass

,