본문 바로가기
  • 읽고보고쓰고
PROGRAMMING/C#

Delegate & Event

by 체리그루브 2012. 2. 22.
728x90

 

특징

Delegate VC Message 기반의 Event Handler Function Point를 이용한 전통적인 Callback 방식의 호출에 비하여 많은 장점을 가진다.

VC Function Pointer & Message Handler

C# Delegate & Event

정적 함수만 사용가능하므로 함수와 Object간의 관련을 위한 별도의 처리가 필요

멤버함수 사용가능

따라서 호출한 함수와 호출대상이 되는 인스턴스를 함께 캡슐화함

Function Pointer Message는 하나의 Function을 호출

하나 이상의 함수를 순차적으로 호출가능

Message Queue를 이용한 실제 Message의 처리

추상적인 Event에 대한 Handler의 호출

Event Handler는 고정됨

+=, -=에 의하여 Event Handler를 추가,삭제,변경 가능

Windows Message를 이용하는 Event Handler인 경우, Event Handler CWnd-Derived Class에 속해야 함

Delegate는 임의의 Class Method로 지정할 수 있음

Windows Message를 이용하는 Event Handler인 경우, Message를 전송하는 측에서 수신측 Window Handler(또는 Pointer)를 지정하므로 Event Handler를 여러 Class에 분산시키기 어려움

Delegate를 이용한 Event는 수신측에서 Event Handler를 지정하므로 임의의 Class Handler를 분산시키기가 용이하며, 여러 Class에서 하나의 Event에 대한 Handler를 각각 지정할 수도 있음

 

위의 특징으로 인하여 Delegate Component Base의 구성에서 Event를 발생시키는 Object를 완전하게 캡슐라이징 시킬 수 있다. 또한 C#Assembly 참조 기능을 이용하여 Event를 발생시키는 Object Binary 수준에서 분리하여 완전한 Component화를 가능하게 한다.

이는 외부 Interface가 많은 단위 시스템에서 Interface를 완전히 Component화된 구성으로 구현가능하게 한다. (C++은 비록 가능하다 하더라도, Class Member Function Point로 되지 못하므로 매우 복잡하고 난해한 Source Code를 필요로 하게 된다.)

따라서 Interface를 사용하는 개발자는 외부 Interface가 어떠한 방식으로 처리되는가를 모르는 상태에서 Interface에 의하여 발생되는 Event , 처리를 원하는 Event를 선택하여 개발이 가능하게 된다.

 

 

 

Event

event Object Class가 특정 Event Handler를 제공하여 Event에 대한 실행코드를 추가할 수 있도록 한다.

event 선언시 Type은 반드시 delegate type이어야 하며, +=-=연산자를 이용하여 하나 이상의 함수를 추가/삭제하여 호출할 수 있다.

+= -= 만이 이벤트를 선언하는 형식 외부의 이벤트에서 허용되므로, 외부 코드로 이벤트에 대한 처리기를 추가 또는 제거할 수 있으며 다른 방법으로는 이벤트 처리기의 내부 목록을 구하거나 수정할 수 없다.

 

2. Using Delegate & Event

Event 정의

Event를 제공하기 위해서는 아래의 과정을 거친다.

 

1. Delegate 정의

event delegate type만을 사용할 수 있으므로 사용할 delegate를 정의한다.

함수의 정의는 실제로 Event Handler로 사용할 함수의 정의와 동일한 형태이다.

// 신고자전화연결

public delegate void CallConnected_Handler(string callID, string ANI);

// 신고자주소표시

public delegate void ALIReceived_Handler(string callID);

 

2. Event 정의

Event Property를 정의한다. 이때 위에서 정의한 delegate type을 사용한다.

public event CallConnected_Handler          eventCallConnected;

public event ALIReceived_Handler            eventALIReceived;

 

3. Event 호출

특정한 상황에서 Event Handler가 호출되어야 한다면, 해당 Event를 호출한다. 실제로 Client측에서는 이 시점에서 Event Handler가 호출된다.

// 외부 Interface에 의하여 Data가 수신됨

// callID ANI가 수신됨

eventCallConnected (callID, ANI);

위 코드에서 eventCallConnected Event가 추가되어 있지 않다면 에러가 발생하므로 이를 우선 검사할 필요성이 있다.

 

Event Handler의 정의

Event를 수신하는 Class에서의 Event Handler의 정의는 아래의 과정을 거친다.

 

1. Event Handler를 위한 함수 정의

Event에 대한 Handler를 정의한다. Handler는 해당 event에 대한 Delegate와 동일한 형태이어야 한다.

private void onCallConnected(string callID, string ANI)

{

   // Event에 대한 처리

   lblANI.Text = ANI;

}

 

2. Event 추가

위 함수를 event로 등록한다. 반드시 정의된 Delegate Type으로 사용한다.

IFMan.getIF.eventCallConnected += new IFMan.CallConnected_Handler(OnCallConnected);

IFMan.getIF.eventALIReceived += new IFMan.ALIReceived_Handler(OnALIReceived);

위 코드에서 IFMan Delegate Event가 정의된 Class 이다.

 

 

출처 : http://rainiac.com/lecture/CS/CS_Delegate.htm

728x90

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

CS CustomControl Part2  (0) 2012.02.22
CS CustomControl Part1  (0) 2012.02.22
Windows Message override하기  (0) 2012.02.22
문자열에서 확장자 없애기 - C#  (0) 2012.02.13
문자열이 숫자 값을 나태는지 확인  (0) 2012.02.13

댓글