— 특징
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이어야 하며, “+=”과 “-=”연산자를 이용하여 하나 이상의 함수를 추가/삭제하여 호출할 수 있다.
“+=” 및 “-=” 만이 이벤트를 선언하는 형식 외부의 이벤트에서 허용되므로, 외부 코드로 이벤트에 대한 처리기를 추가 또는 제거할 수 있으며 다른 방법으로는 이벤트 처리기의 내부 목록을 구하거나 수정할 수 없다.
— 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 이다.
'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 |
댓글