[C#] 델리게이트 ( delegate , 대리자 )

|

델리게이트 ( delegate , 대리자 )



1.델리게이트란


델리게이트란 간단히 말해서 C나 C++에서 사용하는 함수포인터의 기능을 합니다. 즉 함수를 가리키는 변수를 의미합니다.

델리게이트의 선언 및 사용은 아래와 같습니다.


public delegate void Del(string message);
 
// 델리게이트와 연결될 함수 선언
public static void DelegateMethod(string message)
{
    System.Console.WriteLine("Default:" + message);
}
 
// 델리게이트 초기화
Del handler = DelegateMethod;
 
// 델리게이트 호출
handler("Hello World");
 
//결과 Default:Hello World


델리게이트르 선언후에 델리게이트에 함수를 할당해줍니다. 이때 델리게이트와 할당되는 함수는 같은 시그니처여야만 합니다.

즉, 같은 형태/같은 수의 파라미터를 받아야 하며 리턴도 같은 형태이어야 합니다. 

여기에서는 파리미터로 string 을 하나 받고 리턴형으로 void 형태를 취했습니다.


델리게이트를 실행함으로써 원래의 함수가 실행이 됩니다. 델리게이트는 파라미터가 있으면 전달을 하며 리턴 값이 있으면 해당

값을 호출자에게 리턴합니다.



2.델리게이트 의 멀티캐스팅


델리게이트는 +/- 연산자로 둘 이상의 함수를 연결할 수 있습니다. 두개이상을 연결하는 것을 멀티캐스팅이라고 합니다.

+로 추가된 함수는 순차적으로 실행이 되며 만약 참조값이 있는 파라미터면 변경된 값들이 전달이 됩니다.


public class MethodClass
{
 void Method1(string message) { Console.WriteLine("M1:" + message); }
 void Method2(string message) { Console.WriteLine("M2:" + message); }
}
 
 
 MethodClass obj = new MethodClass();
 Del d1 = obj.Method1;
 Del d2 = obj.Method2;
 Del d3 = DelegateMethod;
 
 //+연산자로 대상 등록
 Del allMethodsDelegate = d1 + d2;
 
 allMethodsDelegate += d3;
 
 allMethodsDelegate("C#");
 
 allMethodsDelegate -= d1;
 
 allMethodsDelegate("C#");
 
//결과
//M1:C#
//M2:C#
//Default:C#
//M2:C#
//Default:C#


이 델리게이트 +- 이용해서 함수를 추가하거나 삭제하는 것은 이벤트에서 사용이 가능합니다.

아래에서 다루겠습니다.



3.이벤트와 연계


델리게이트를 이용해서 이벤트를 처리가 가능합니다.

델리게이트를 선언후에 그것을 참조하는 곳에서 +로 이벤트를 등록합니다.


이것은 위에서 봤듯이 함수의 연결을 추가하는 것과 동일합니다. 즉, 이벤트가 발생된 클래스에서 해당 이벤트를

등록해서 함수를 구현해 놓은 클래스의 함수를 델리게이트가 연결되어 있다고 보시면 됩니다.

또한 이벤트 구독을 해지하려면 -연산자로 해지 해주면 더이상 이벤트를 받지 않습니다.


//다른곳에서 정의 된 클래스
public class SomthingDelegateEvent
{
    public delegate void delPushMessage(string message);
    public event delPushMessage eventPushMessage;
 
    public void GenerateEvent(string PushMessage)
    {
        if (eventPushMessage != null)
        {
            eventPushMessage(PushMessage);
        }
    }
    
}
 
//클래스를 사용하는 곳에서 이벤트 등록
SomthingDelegateEvent DelegateEvent1 = new SomthingDelegateEvent();
DelegateEvent1.eventPushMessage += DelegateEvent1_eventPushMessage;
DelegateEvent1.eventPushMessage += DelegateEvent1_eventPushMessage2;
 
//이벤트를 가상으로 호출
DelegateEvent1.GenerateEvent("Multicast!");
 
 
//대리자가 연결되는 함수1
void DelegateEvent1_eventPushMessage(string message)
{
    System.Console.WriteLine(message);
}
 
//대리자가 연결되는 함수2
void DelegateEvent1_eventPushMessage2(string message)
{
    System.Console.WriteLine(message);
}
 
//결과
//Multicast!
//Multicast!


SomthingDelegateEvent 라는 클래스를 다른 곳에서 미리 정의한 클래스에 이벤트를 여러곳에서
받을 수가 있습니다. 여기에서는 이것을 보여주려고  일부러 2번을 등록했는데요. 결과를 보시면 두번
다 호출되는 것을 확인할 수 있습니다.


And