<대리자(delegate)>

 

"대리자(delegate)"는 특정한 메서드에 대한 참조를 가지는 타입(type).

 

즉, 대리자는 메서드를 변수처럼 저장하고, 전달하며, 호출할 수 있게 해주는 객체이다.

 

 대리자는 C#과 같은 객체 지향 프로그래밍 언어에서 중요한 기능으로,

이벤트 처리콜백 메서드의 구현에 자주 사용된다.

 

 

<대리자의 주요 특징>

메서드 참조: 대리자는 하나 이상의 메서드를 참조할 수 있으며, 이를 통해 메서드를 변수처럼 전달하고 호출할 수 있다.

타입 안전성: 대리자는 특정 시그니처(매개변수와 반환 타입)를 가진 메서드만 참조할 수 있다. 이를 통해 타입 안전성을 보장한다.

멀티캐스팅: 하나의 대리자 인스턴스가 여러 메서드를 참조할 수 있으며, 대리자를 호출할 때 참조된 모든 메서드가 순차적으로 실행된다.

 

 

C#에서는 두 가지 기본적인 대리자 타입을 제공한다.

System.Delegate: 모든 대리자의 기본 클래스
System.MulticastDelegate: Delegate를 상속받으며, 여러 메서드를 참조할 수 있는 대리자의 기본 클래스

 

 

<예제>

public delegate int MyDelegate(int x, int y); // 대리자 정의

public class Example
{
    public static int Add(int a, int b)
    {
        return a + b;
    }

    public static int Multiply(int a, int b)
    {
        return a * b;
    }

    public static void Main()
    {
        MyDelegate del = new MyDelegate(Add); // 대리자 인스턴스 생성 및 메서드 참조
        int result = del(10, 20); // 대리자를 통한 메서드 호출
        Console.WriteLine(result); // 결과 출력

        del += Multiply; // 대리자에 다른 메서드 추가 (멀티캐스팅)
        result = del(10, 20); // 이제 Add와 Multiply 둘 다 호출
    }
}

 

위 예제에서 MyDelegate는 두 개의 int 매개변수를 받고 int를 반환하는 메서드를 참조할 수 있는 대리자이다. 

 

Add와 Multiply 두 메서드는 이 대리자의 시그니처와 동일하다.

 

Main 메서드에서는 MyDelegate 타입의 대리자를 생성하고, Add 메서드를 참조하여 호출한다. 

이후에 Multiply 메서드를 추가하여 멀티캐스팅 기능을 사용 할 수 있다. 

 

 

이때, 코드의 result = del(10, 20); 부분은 실제로 대리자 del에 등록된 모든 메서드 (AddMultiply)를 호출하는데,

 

 

여기서 중요한 점은 멀티캐스트 대리자가 여러 메서드를 호출할 때 각 메서드의 반환 값은 기본적으로 무시되고,

오직 마지막에 호출된 메서드의 반환 값만이 최종적으로 대리자 호출로부터 반환된다는 점이다.

 

+ Recent posts