본문 바로가기

개인공부/C#

[C#] 대리자(Delegate)

 

■ 대리자(Delegate) : 

 - 메서드(Method)를 대신 실행하는 객체로 실행할 메서드는 컴파일 시점이 아닌 실행 시점에 결정

 - delegate 키워드로 선언

 - 메서드(Method)처럼 매개변수와 반환 형식을 가짐

 - delegate에 Method를 참조할 때는 반환 형식과 매개변수 구조가 같아야 한다

MyDelegate는 매개변수가 있지만 Method_C는 매개변수가 없어 오류 발생

 

■ Example

using System;

namespace DelegateExample
{
    class Program
    {
        delegate void MyDelegate(int num);

        static void Method_A(int a)
        {
            Console.WriteLine($"[Method_A] a = {a}");
        }

        static void Method_B(int b)
        {
            Console.WriteLine($"[Method_B] b = {b}");
        }

        static void Main(string[] args)
        {
            MyDelegate myDelegate = new MyDelegate(Method_A);
            myDelegate(100);
            myDelegate = new MyDelegate(Method_B);
            myDelegate(200);
        }
    }
}

 

Example 결과

 

■ 대리자 체인(Delegate Chain) :

 - 하나의 대리자(delegate)에 여러 개의 method를 참조할 수 있음

 - 체인 연결 : +=

 - 체인 끊기 : -=

■ Example

using System;

namespace DelegateExample
{
    class Program
    {
        delegate void MyDelegate(string str);

        static void Method_A(string a)
        {
            Console.WriteLine($"[Method_A] a는 {a}입니다.");
        }

        static void Method_B(string b)
        {
            Console.WriteLine($"[Method_B] b는 {b}이다.");
        }

        static void Method_C(string c)
        {
            Console.WriteLine($"[Method_C] c = {c}");
        }

        static void Main(string[] args)
        {
            MyDelegate myDelegate = new MyDelegate(Method_A);
            myDelegate += new MyDelegate(Method_B);
            myDelegate += new MyDelegate(Method_C);
            
            myDelegate("memoo");
            Console.WriteLine();
            
            myDelegate -= Method_C;
            myDelegate("memoo");

        }
    }
}

 

Example 결과

 

■ 익명 메서드(Anonymous Method) : 

 - 다른 블록에서 재사용될 일이 없는 이름 없는 메서드(Method)

 - 대리자(delegate)의 형식에 맞게 익명 메서드를 작성해야 한다

 

■ Example

using System;

namespace AnonymousMethodExample
{
    class Program
    {
        delegate int MyDelegate(int a, int b);
        static void Main(string[] args)
        {
            MyDelegate myDelegate;

            myDelegate = delegate (int a, int b)
            {
                return a + b;
            };

            Console.WriteLine($"result = {myDelegate(100, 200)}");
        }
    }
}

 

Example 결과

 

 

 

 

 

 

 

'개인공부 > C#' 카테고리의 다른 글

[C#] 대리자(Delegate), 이벤트(Event) 차이점  (0) 2023.02.15
[C#] 이벤트(Event)  (0) 2023.02.14
[C#] 예외(Exception)  (0) 2022.10.07
[C#] 일반화(Generalization)  (0) 2022.09.26
[C#] 인덱서(Indexer), IEnumerable, IEnumerator  (0) 2022.09.26