본문 바로가기
프로그래밍/C#

C# Delegate

by 뽀도 2017. 6. 14.

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 < 2return;
            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 = { 553371 };
            
            //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


반응형

댓글