본문 바로가기
IT Study/C#

[C#] 델리게이트(Delegate)

by dev_huhu 2021. 1. 24.
반응형

1. 델리게이트 (대리자)

: 메서드를 참조하는 형식으로 대리자에 메서드가 할당되면 대리자는  이 메서드와 똑같은 방식으로 동작한다.

  • 대리자를 통해 메서드를 매개 변수로 전달할 수 있다.
  • 대리자를 사용하여 콜백 메서드를 정의할 수 있다.
  • 여러 대리자를 연결할 수 있다. (델리게이트 체인)

 

2. 콜백 메서드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        // 델리게이트 선언
        public delegate void del(string s);

        public static void delegateMethod(string s)
        {
            Console.WriteLine(s);
        }

        public static void delCallback(int a, int b, del callback)
        {
            callback("더하기: " + (a, b).ToString());
        }

        static void Main(string[] args)
        {
            // 델리게이트 참조
            del handler = delegateMethod;
            handler("Hello World!");
            delCallback(1, 2, handler);

        }
    }
}

 

3. 델리게이트 체인

: 하나의 델리게이트 메서드에 여러 메서드를 연결한다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    delegate void MyDelegate();

    class Program
    {
        public static void func1() { Console.WriteLine("func1 호출"); }
        public static void func2() { Console.WriteLine("func2 호출"); }
        public static void func3() { Console.WriteLine("func3 호출"); }

        static void Main(string[] args)
        {
            MyDelegate del;
            // 여러 개의 메서드 참조
            del = new MyDelegate(func1);
            del += func2;
            del += func3;

            del();

            Console.WriteLine("-----------");

            del -= func1;
            del -= func3;

            del();

        }
    }
}

 

4. 익명 메서드

: C# 2.0보다 이전 버전의 C#에서는 명명된 메서드를 사용하는 방법으로만 대리자를 선언할 수 있었지만, C# 2.0에는 무명 메서드가 도입되었고 C#3.0 이상에서는 무명 메서드 대신 람다 식을 사용하는 방식으로 구현 할 수 있다.

 

- 대리자를 인스턴스화하는 두 가지 방법이 있는데 하나는 대리자를 무명 메서드로 연결하는 방법, 다른 하나는 대리자를 명명된 메서드에 연결하는 방법

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    delegate void Del(string s);

    class ExClass
    {
        static void Main(string[] args)
        {
            Del d = delegate(string s)
            {
                System.Console.WriteLine(s);
            };
            d("무명 메서드 호출");
            d = new Del(ExClass.MessageShow);
            d("명명 메서드 호출");
           
        }

        static void MessageShow(string s)
        {
            System.Console.WriteLine(s);
        }
    }
}

반응형

'IT Study > C#' 카테고리의 다른 글

[C#] 리플렉션(Reflection), 애트리뷰트(Attribute)  (0) 2021.03.04
[C#] 확장 메서드, 람다  (0) 2021.01.25
[C#] 프로퍼티(Property), 익명 타입  (0) 2021.01.25
[C#] 암묵적 타입  (0) 2021.01.25
[C#] 스레딩(Threading)  (0) 2021.01.25

댓글