본문 바로가기

C#,WPF

[C#.NET] 델리게이트(Delegate)



델리게이트는
 메소드를 가르키는 참조형으로서 메소드의 번지를 저장하거나 다른 메소드의 인수로 메소드 자체를 전달하고 싶을때 사용한다.
이벤트와 스레드를 처리하는데 주로 사용된다.

C/C++에서는 함수 포인터가 비슷한 기능을 한다.
하지만 델리게이트는 이보다 더 객체지향적이며 타입이 안정적이다.

여기서 타입이 안정적이다는말은
 -> 델리게이트의 형태와 참조할 메소드의 형태가 항상 일치해야함을 뜻한다.



MSDN에 나오는 예제를 예로 보겠다.
다음은 문자열을 인수로 받고, void를 반환하는 메서드이다.
이 메서드를 캡슐화 할 수 있는 Del 이라는 대리자를 선언한다.

  public delegate void Del(string message);

  형식 : [수정자] delegate [반환형] 델리게이트 이름(매개변수);


대리자 개체경우엔 일반적으로 이름을 제공하거나, 익명 메서드(MSDN에서는 무명 메서드라고함) 를 사용하는 방법으로 만들어진다.



 

▷ 다음과같이 같은 형식을 띄는 원래 메서드 Func()가 있다.
public static void Func(string message)
{
    System.Console.WriteLine(message);
}


▷ 다음과 같이 이미 선언된 델리게이트를 메서드를 이용하여 인스턴스화 한다. // Instantiate the delegate.
  위 그림에서 인스턴스화 시켜 대리자 개체(호출자)가 되는 과정이다.
 Del handler = DelegateMethod;


▷ 이제 대리자(Delegate)를 통하여 호출해보겠다. 
 handler("Hello World");

호출자 handler 는 인수인 "Hello World"를 대리자를 통하여 메서드로 보내준다.
만약 메서드의 반환값이 있을경우 대리자가 해당 값을 호출자에게 반환하는 역할까지 한다.






 public void MethodWithCallback(int param1, int param2, Del callback)
{
   callback("The number is: " + (param1 + param2).ToString());
}

델리게이트 Del형식을 매개변수로 받는 매개변수 callback 을 보고 있다.

이 함수를 호출하는데 MethodWidthCallback(1,2, handler); 를 보내주면
param1과 param2를 합한 수를 String으로 변환해서 문자로 합쳐준 후 최종 string을
callback(string message)에 넣어주게 된다.