q 메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캡슐화할 수 있게 만들어 주는 방법
Delegate가 주는 장점은 메서드 자체가 캡슐화 되어있기 때문에 메서드를 보다 효율적으로 사용할 수 있게 해 줍니다. 다음은 Delegate의 간단한 구현입니다.
using System;
delegate void SimpleDelegate1();
delegate void SimpleDelegate2(int i);
class AType{
public void F1() {
System.Console.WriteLine("AType.F1");
}
public void F2(int x){
System.Console.WriteLine("AType.F2 x=" + x);
}
}
class DeleTest {
public static void
AType atype = new AType();
SimpleDelegate1 s1 = new SimpleDelegate1(atype.F1);
SimpleDelegate2 s2 = new SimpleDelegate2(atype.F2);
s1();
s2(1000);
}//main
}//class
메서드를 캡슐화하여 사용할 수 있다는 것은 아주 단순한 기능입니다. 단순한 기능만큼이나 Delegate의 파워는 굉장합니다. 다음과 같은 경우를 예를 들어보죠. 만약 하나의 클래스에서 다른 것은 필요 없고 단지 특정객체의 메서드에만 관심이 있다고 가정해보죠. 특정객체의 메서드는 그 객체의 멤버로 소속되어 있기 때문에 그 객체의 모든 기능을 사용할 수 있을 것입니다. 그런데 어떻게 메서드만을 속 빼올까라는 생각을 하게 될 것입니다.
C#에서 스레드를 실행한다는 것은 이와 비슷합니다. C#에서 사용되는 모든 스레드는 하나의 표준 스레드에 메서드만 추가 시켜주고 스레드를 시작하면 작업을 수행합니다. 만약 메서드 10개가 있다면 표준 스레드 10개를 만들고, 메서드를 표준 스레드에 하나씩 넣어주고 실행하라고 명령을 내리면 10개의 스레드가 동시에 작업을 수행하게 됩니다.
스레드와 메서드의 관계는 아주 단순합니다. Main() 메서드도 알고 보면 스레드입니다. 표준 스레드에 Main()을 넣어주고 실행해 달라는 것이니까요. 즉, 10개의 Main을 동시에 돌린다고 가정해 보죠. 이럴 때는 10개의 표준 스레드가 필요하고 10개의 Main() 메서드를 각각 넣어준 뒤 실행을 하면 10개의 스레드는 CPU의 Time을 분할해서 사용하게 되는 것입니다. 너한번 또 다른 너한번...... 그리고 마지막으로 나한번! 즉, 표준 스레드 입장에서는 항상 스레드가 수행되어지기 전에 어떤 메서드가 들어올지 궁금해 할 것입니다. 이런 면에서 스레드는 다른 객체의 메서드만을 쏙 빼와서 수행하고자 할 것입니다. 이 때 스레드는 메서드를 Delegate로 포장해서 그 메서드만을 달라고 요청하는 것입니다. 실제 스레드를 실행하기 위한 예는 다음과 같습니다.
n Top t = new Top();
n Thread t = new Thread(new ThreadStart(t.메서드));
n thread.Start();
C#에서 등장하는 Delegate는 스레드, 이벤트에서 아주 중요한 역할을 담당하고 있습니다. 메서드를 캡슐화하여 이용하고자 한다면 어디든 등장하는 놈이 바로 Delegate입니다. 특정 객체에서 메서드를 직접 호출하는 것보다 메서드의 표준틀을 이용하여 사용하는 것이 휠씬 쉬우니까요. 그리고 사실 Delegate는 C++에서 메서드의 주소호출에 해당합니다. 메서드의 특정 주소를 이용하여 메서드를 더욱 안전하고 쉽게 호출하겠다는 의미를 담고 있습니다. 말 그대로 Delegate는 메서드의 대리자가 되는 것입니다.
출처 : 소설 같은 C#