# 델리게이트(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(11, 22, plusCalc); // 33 출력 Calculator(33, 22, 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
'언어 > C#' 카테고리의 다른 글
[C#] nullable 형식 한정자 (0) | 2018.11.07 |
---|---|
[C#] ?? 연산자 (null 병합 연산자) (0) | 2018.11.07 |
[C#] ?. 연산자 (null 조건부 연산자) (0) | 2018.11.07 |
[C#] 사용자 정의 형변환 - explicit, implicit (0) | 2018.10.16 |
[C#] 선택적 매개 변수와 명명된 매개 변수 (0) | 2018.09.27 |