# 델리게이트(Delegate)

 해석하면 '대리인'이라는 뜻의 델리게이트는 C++의 포인터처럼 메서드를 안전하게 캡슐화하는 형식입니다.
즉, 메소드를 대신해서 호출하는 역활을 하는 메소드를 참조하는 변수입니다.
특정 메소드를 처리할 때 그 메소드를 직접 호출해서 실행시켜야 했지만, 델리게이트를 사용하면 그 메소드를 대신하여 호출할 수 있습니다.

# 사용방법
(1) 델리게이트 타입 선언.
    메소드 타입은 매개변수와 반환타입에 의해 결정됩니다.
    델리게이트 타입도 그 메소드와 동일한 매개변수, 반환 타입으로 선언해주면 됩니다. 
(2) 델리게이트 인스턴스화하여 메서드 전달.

(3) 델리게이트 호출.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace DelegateTest
{
    class Program
    {
        delegate void Del(string message);
        public static void DelegateMethod(string message)
        {
            System.Console.WriteLine(message);
        }
        static void Main(string[] args)
        {
            // 명명된 메서드 전달.
            Del handler = DelegateMethod;
            // 무명 메서드 전달.
            Del handler2 = delegate (string message)
                            { System.Console.WriteLine(message); };
            // 람다식 활용.
            Del handler3 = (message) => System.Console.WriteLine(message);
            handler("Hello World");
            handler2("Bye World");
        }
    }
}
cs

# 콜백 메서드
인스턴스화 된 델리게이트는 매개 변수로 전달하거나 속성에 할당할 수 있습니다.
따라서, 메서드가 델리게이트를 매개 변수로 허용하여 매개 변수로 받은 델리게이트를 나중에 호출할 수 있습니다. 

이러한 방식을 비동기 콜백이라고 부르며, 콜백 메서드를 구현할 때, 델리게이트의 가치를 볼 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
namespace Calculater
{
    delegate int Calc(int a, int b);
 
    class MainApp
    {
        public static void Calculator(int a, int b, Calc cb)
        {
            Console.WriteLine(cb(a, b));
        }
 
        public static int Plus(int a, int b) { return a + b; }
        public static int Minus(int a, int b) { return a - b; }
 
        static void Main(string[] args)
        {
            Calc plusCalc = new Calc(Plus);
            Calc MinusCalc = new Calc(Minus);
 
            Calculator(1122, plusCalc);  // 33 출력
            Calculator(3322, MinusCalc); // 11 출력
        }
    }
}
cs



# 델리게이트 체인

델리게이트는 둘 이상의 메서드를 호출할 수 있습니다. 이러한 호출을 멀티캐스트라고 합니다.

델리게이트에 메서드 목록을 추가하려는 경우, 더하기 또는 더하기 대입 연산자('+' 또는 '+=')를 사용합니다. 

메서드 제거도 가능한데, 제거하는 경우엔 감소 또는 감소 대입 연산자('-' 또는 '-=')를 사용하면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace Multicast
{
    delegate void PrintText();
 
    class MainApp
    {
        public static void First() { Console.Write("첫번째 "); }
        public static void Second() { Console.Write("두번째 "); }
        public static void Third() { Console.Write("세번째 "); }
 
        static void Main(string[] args)
        {
            PrintText MultiHandler;
 
            MultiHandler = new PrintText(First);
            MultiHandler += Second;
            MultiHandler += Third;
 
            Console.WriteLine("메서드 추가");
            MultiHandler();
 
            MultiHandler -= First;
            MultiHandler -= Third;
 
            Console.WriteLine("\n\n메서드 제거");
            MultiHandler();
        }
    }
}
cs



    [ 콘솔 출력 결과 ]


    메서드 추가

    첫번째 두번째 세번째


    메서드 제거

    두번째





delegate 관련 Effective C# : https://loveme-do.tistory.com/14


참   고 : https://mrw0119.tistory.com/19?category=585887

           https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/delegates/using-delegates

+ Recent posts