1. 개념
만약 어떤 기능을 실행하는 메소드를 호출할 필요가 있을때, 그냥 직접적으로 호출하는 형식입니다.
델리게이트는 호출하는코드랑 호출되는메서드 사이에 있다고 생각하면 됩니다.
어떤 메소드를 호출한다고할때.
델리게이트 사용 : 메소드호출 ---> 델리게이트 ---> 호출당하는 메소드
일반적인메소드호출 : 메소드호출 ---> 호출당하는 메소드
즉. 메소트호출쪽은 호출되는메소드를 직접 부르는 것이 아니고 델리게이트를 대신 부르게 됩니다.
이처럼 중간자(대리자)역활을 합니다.
2. 왜 사용하는지
한마디로 유연성입니다.
저도 첨에책으로만 볼땐 그래서 머! 걍호출하면 되지 웨 써 복잡하게라고 생각했었습니다.
예를들어 폼위에 버튼을 올려놓고 클릭을 하게 되면 클릭이벤트로 가게되죠?
이건 마소에서 처음 .net을 개발할때 버튼콘트롤 소스하고 버튼클릭이벤트메소드(예:button1_Click)
를 델리게이트로 연결했기 때문에 우리가 볼땐 콘트롤을 누르면 이벤트메소드로 가는것처럼 보이는겁니다.
뒤에서는 델리게이트가 중간에 연결을 해주고 있죠!
좀이해가 안가시죠. 그럼 어디에 사용하는지 한번 보죠.
3. 어디에 사용하는지
이걸 응용하자면 엄청 많을 것 같은데..
1..한번에 10개의 매소드를 실행하고 싶을때.
10개의 메소드를 전부 호출하는 것이 아니고.
델리게이트를 걸어서 델리게이트를 한번호출합니다.
2..비동기처리에 사용합니다.
예를들어 어떤 이벤트가 발생되서 실행되는
A라는 메소드가 있는데 이놈은 한번 실행하면 최소 10분이상걸리는 놈입니다.]
보통 델리게이트를 사용하지 않았을 경우 이놈이 끝날때까지 기다린후,다른 처리를 하게되는데.
델리게이트걸어 비동기화 시켜주게되면 일단 실행이 되고,
실행이 끝나던말든 다음처리를 할수 있습니다.
이걸,멀티캐스팅이라고 하나요.
↓비동기처리의 예
using System;
delegate void ShowMessageDelegate(string msg);
class Callable {
internal void ConcreteShowMessage(string msg) {
System.Threading.Thread.Sleep(5 * 1000);
Console.WriteLine(msg);
}
}
class Caller {
internal ShowMessageDelegate ShowMessage;
internal IAsyncResult CallDelegate() {
IAsyncResult ret
= ShowMessage.BeginInvoke("hello, from delegate!",
new AsyncCallback(Callback), ShowMessage);
return ret;
}
internal void Callback(IAsyncResult ar) {
ShowMessageDelegate usedDelegate
= (ShowMessageDelegate)ar.AsyncState;
usedDelegate.EndInvoke(ar);
}
}
class App {
static void Main() {
Callable callable = new Callable();
Caller caller = new Caller();
caller.ShowMessage
= new ShowMessageDelegate(callable.ConcreteShowMessage);
IAsyncResult ar = caller.CallDelegate();
while(!ar.IsCompleted) {
System.Threading.Thread.Sleep(500);
Console.Write(".");
}
Console.WriteLine("Done.");
}
}
|
출처 : 네이버 아이디: