C# Delegate
C# delegate는 c/c++의 함수 포인터와 비슷한 개념으로 메서드 파라미터와 리턴 타입에 대한 정의를 한 후, 동일한 파라미터와 리턴 타입을 가진 메서드를 서로 호환해서 불러 쓸 수 있는 기능이다.
예를 들어 아래 RunDelegate 델리게이트는 입력 파라미터가 int 하나이고 리턴 값이 없는 메서드를 가리킨다.
RunThis() 메서드와 RunThat() 메서드는 모두 int 파라미터 하나에 리턴 값이 없는 메스드므로, RunDelegate의 함수 형식(prototype)과 맞으므로 이 delegate를 사용할 수 있다.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace csharp_study { class Program { static void Main(string[] args) { MyClass mc = new MyClass(); mc.Perform(); } //델리 게이트 정의 class MyClass { // 1. delegate 선언 private delegate void RunDelegate(int i); private void RunThis(int val) { // 콘솔출력 : 1024 Console.WriteLine("{0}", val); } private void RunThat(int value) { // 콘솔출력 : 0x400 Console.WriteLine("0x{0:X}", value); } public void Perform() { // 2. delegate 인스턴스 생성 RunDelegate run = new RunDelegate(RunThis); // 3. delegate 실행 run(1024); //run = new RunDelegate(RunThat); 을 줄여서 //아래와 같이 쓸 수 있다. run = RunThat; run(1024); } } } } | cs |
Delegate를 메서드 파라미터로 전달
Delegate는 동일한 함수 Prototype을 갖는 메서드를 가리키므로 함수의 포인터를 파라미터로 전달하듯, 다른 함수의 파라미터로 사용될 수 있다. delegate 파라미터를 전달받는 쪽은 이를 자신의 내부 함수를 호출하듯 사용할 수 있다.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace csharp_study { class MySort { public delegate int CompareDelegate(int i1, int i2); public static void Sort(int[] arr, CompareDelegate comp) { if (arr.Length < 2) return; Console.WriteLine("함수 prototype: " + comp.Method); int ret; for(int i = 0; i<arr.Length -1; i++) { for(int j = i+1; j<arr.Length; j++) { ret = comp(arr[i], arr[j]); if(ret == -1) { int tmp = arr[j]; arr[j] = arr[i]; arr[i] = tmp; } } } Display(arr); } static void Display(int[] arr) { foreach(var i in arr) { Console.Write(i + " "); Console.WriteLine(); } } } class Program { static void Main(string[] args) { (new Program()).Run(); } void Run() { int[] a = { 5, 53, 3, 7, 1 }; //deleagate 선언 = 초기화 MySort.CompareDelegate compDelegate = AscendingCompare; // 리스트, 딜리게이트 MySort.Sort(a, compDelegate); compDelegate = DescendingCompare; MySort.Sort(a, compDelegate); } int AscendingCompare(int i1, int i2) { if (i1 == i2) return 0; return (i2 - i1) > 0 ? 1 : -1; } int DescendingCompare(int i1, int i2) { if (i1 == i2) return 0; return (i1 - i2) > 0 ? 1 : -1; } } } | cs |
반응형
'프로그래밍 > C#' 카테고리의 다른 글
C# => Lambda Expression : 무명 함수를 표현하는데 사용 주로 Linq에서 많이 사용 (0) | 2017.06.16 |
---|---|
C# Anonymous Method : 무명메서드, 일회용으로 메서드를 사용 할 때 (0) | 2017.06.15 |
C# 이벤트 (0) | 2017.06.14 |
C# 네임스페이스 (0) | 2017.06.14 |
c# Exception 예외처리 (0) | 2017.06.14 |
댓글