대리자(delegate)

00·2024년 12월 25일

C#

목록 보기
74/149
using System;


/*
 대리자(delegate):
메서드에 대한 참조.
대리자에 메소드의 주소를 할당한 후, 대리자를 호출하면 대리자가 메소드를 호출해줌.

델리게이트의 장점?
메서드를 변수처럼 저장하고 전달할 수 있습니다.
메서드를 동적으로 호출할 수 있습니다.
콜백 함수를 구현하는 데 사용할 수 있습니다.
 */


// 대리자(delegate)를 사용하여 메서드를 참조하고 호출하는 방법
namespace Delegate
{
    delegate int MyDelegate(int a, int b); // delegate 키워드를 사용하여,
                                           // MyDelegate라는 이름의 델리게이트를 선언.
                                           // 델리게이트는 인스턴스가 아닌 형식(Type)임,
                                           // 따라서 메소드를 참조하는 무엇을 만드려면
                                           // MyDelegate라는 델리게이트의 인스턴스를 따로 만들어야 함.
                                           // MyDelegate 델리게이트는 두 개의 정수형 '매개변수'를 받고,
                                           // 정수형 값을 '반환'하는 "메서드를 참조"할 수 있습니다.


    // 대리자의 반환 형식과 매개변수를 따르는 메서드를 선언해야 대리자가 참조할 수 있음. 
    class Calculator
    {
        public int Plus(int a, int b) // Plus(): 두 정수를 더하는 '인스턴스 메서드' 
                                      // 인스턴스 메서드(static으로 한정x):
                                      // 인스턴스를 생성해야만 호출가능한 메서드
        {
            return a + b;
        }

        public static int Minus(int a, int b) // Minus(): 두 정수를 빼는 '정적 메서드'
                                              // 정적 메서드(static으로 한정o):
                                              // 인스턴스를 생성안해도 호출가능한 메서드
        {
            return a - b;
        }
    }


    class MainApp
    {
        static void Main(string[] args)
        {
            Calculator Calc = new Calculator(); // Calculator 클래스의 인스턴스인 Calc 생성
                                                // 인스턴스 메서드인 Puls() 메서드 사용하려면 필요함
            
            MyDelegate Callback; // (1) MyDelegate 델리게이트 타입의 변수인 Callback을 선언 

            Callback = new MyDelegate(Calc.Plus); // 생성한 인스턴스(Calc)를 통해야만 호출 가능한 Plus() 메서드 
            Console.WriteLine(Callback(3, 4)); 

            Callback = new MyDelegate(Calculator.Minus); // (2) MyDelegate () 생성자를 호출해서 Callback 인스턴스(객체)를 생성
                                                         // -> 생성자 인수는 Minus() 메서드를 사용
                                                         // -> Callback은 Minus() 메서드를 참조함
            Console.WriteLine(Callback(7, 5)); // (3) 메서드를 호출하듯 대리자를 호출하면, 참조하고 있는 메서드가 실행됨.
                                               // 즉, Calllback을 호출하면 Callback은
                                               // 현재 자신이 참조하는 주소에 있는 메서드(Minus())의 코드를 실행하고,
                                               // 그 결과(숫자 2)를 호출자에게 반환함
        }
    }
}


/*
출력 결과

7
2
 */

코드 설명

이 C# 코드는 델리게이트(delegate)를 사용하는 방법을 보여주는 예제입니다. 델리게이트는 메서드를 참조하는 형식으로, 메서드를 변수처럼 저장하고 전달할 수 있도록 합니다. 마치 메서드에 대한 별명을 붙여서, 별명을 통해 메서드를 호출하는 것과 같습니다.

MyDelegate 델리게이트

delegate int MyDelegate(int a, int b);
  • delegate 키워드를 사용하여 MyDelegate라는 이름의 델리게이트를 선언합니다.
  • int MyDelegate(int a, int b)는 델리게이트의 시그니처를 나타냅니다. 즉, MyDelegate 델리게이트는 두 개의 정수형 매개변수를 받고 정수형 값을 반환하는 메서드를 참조할 수 있습니다.

Calculator 클래스

class Calculator
{
    public int Plus(int a, int b)  // 두 정수를 더하는 인스턴스 메서드
    {
        return a + b;
    }

    public static int Minus(int a, int b)  // 두 정수를 빼는 정적 메서드
    {
        return a - b;
    }
}
  • Plus 메서드는 두 개의 정수를 더하는 인스턴스 메서드입니다.
  • Minus 메서드는 두 개의 정수를 빼는 정적 메서드입니다.

MainApp 클래스

class MainApp
{
    static void Main(string[] args)
    {
        Calculator Calc = new Calculator();  // Calculator 객체 생성
        MyDelegate Callback;  // MyDelegate 델리게이트 변수 선언

        Callback = new MyDelegate(Calc.Plus);  // Plus 메서드를 델리게이트에 할당
        Console.WriteLine(Callback(3, 4));  // 델리게이트를 통해 Plus 메서드 호출 (출력: 7)

        Callback = new MyDelegate(Calculator.Minus);  // Minus 메서드를 델리게이트에 할당
        Console.WriteLine(Callback(7, 5));  // 델리게이트를 통해 Minus 메서드 호출 (출력: 2)
    }
}
  • Calculator Calc = new Calculator();: Calculator 클래스의 객체 Calc를 생성합니다.
  • MyDelegate Callback;: MyDelegate 델리게이트 타입의 변수 Callback을 선언합니다.
  • Callback = new MyDelegate(Calc.Plus);: Calc 객체의 Plus 메서드를 Callback 델리게이트에 할당합니다.
  • Console.WriteLine(Callback(3, 4));: Callback 델리게이트를 호출합니다. 이는 Calc.Plus(3, 4)를 호출하는 것과 같습니다.
  • Callback = new MyDelegate(Calculator.Minus);: Calculator 클래스의 정적 메서드 MinusCallback 델리게이트에 할당합니다.
  • Console.WriteLine(Callback(7, 5));: Callback 델리게이트를 호출합니다. 이는 Calculator.Minus(7, 5)를 호출하는 것과 같습니다.

델리게이트의 장점

  • 메서드를 변수처럼 저장하고 전달할 수 있습니다.
  • 메서드를 동적으로 호출할 수 있습니다.
  • 이벤트 처리에 사용할 수 있습니다.
  • 콜백 함수를 구현하는 데 사용할 수 있습니다.

이 코드는 델리게이트를 사용하여 메서드를 참조하고 호출하는 방법을 보여줍니다. 델리게이트는 C#에서 매우 유용한 기능이며, 다양한 상황에서 활용될 수 있습니다.

0개의 댓글