23 delegate(1)

vencott·2021년 6월 2일
0

C#

목록 보기
23/32

delegate의 개념

메서드의 파라미터와 리턴 타입이 동일한 것을 prototype이 일치한다고 한다

delegate는 메서드 파라미터와 리턴 타입에 대한 정의를 한 후 동일한 prototype을 가지는 메서드를 서로 호환해서 불러 쓸 수 있는 기능이다

using System;
namespace MySystem
{
    class MyClass
    {
        // delegate 선언
        private delegate void RunDelegate(int i);

        private void RunThis(int val)
        {
            Console.WriteLine("{0}", val);
        }

        private void RunThat(int value)
        {
            Console.WriteLine("0x{0:X}", value);
        }

        public void Perform()
        {
            RunDelegate run = new RunDelegate(RunThis);
            run.Invoke(1024);

            //run = new RunDelegate(RunThat);
            //run.Invoke(1024);
            run = RunThat;
            run(1024);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.Perform();
        }
    }
}

delegate를 메서드 파라미터로 전달

delegate는 동일한 함수 prototype을 갖는 메서드를 가리키므로 다른 함수의 파라미터로 사용될 수 있다

파라미터로 delegate를 전달받은 메서드는 이를 자신의 내부 함수를 호출하듯 사용할 수 있다

class MySort
{
    // CompareDelegate 선언
    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 };
        
        // 올림차순
        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;
    }
}

출처: http://www.csharpstudy.com/

profile
Backend Developer

0개의 댓글