일상+

Delegate 간단한 예제 본문

컴퓨터공학

Delegate 간단한 예제

이종준 2009. 1. 23. 16:39
델리게이트는 우리말로 '위임' 또는 '대리자'로 번역된다.
위임이란 어떤일을 자기가 처리하지 않고 남에게 떠넘긴다는 뜻이다.
델리게이트는 C/C++에서 사용하는 함수 포인터와 동일한 개념으로, 주로 이벤트와 관련된 처리에 사용된다. C#에서 델리게이트는 메서드의 포인터(메서드 이름)를 지정할 뿐 내부에 코드를 기술하지는 않는다.
델리게이트는 delegate 키워드를 사용해 선언한다.

간단한 예제 코드를 살펴 보도록 하자.


namespace Delegate_test
{
    class Arithmetic
    {
        public int Add(int a, int b) { return a + b; }
        public int Sub(int a, int b) { return a - b; }
        public int Mul(int a, int b) { return a * b; }
        public int Div(int a, int b)
        {
            if ((a == 0) || (b == 0)) return 0;
            return a / b;
        }
        public void PrintInfo(string str)
        {
            System.Console.WriteLine("Arithmetic::PrintInfo = {0}", str);
        }
    }

    public delegate int ArithmeticDelegate(int a, int b); // 델리게이트 정의
    public delegate void PrintInfoDelegate(string str);

    class Program
    {
        static void Main(string[] args)
        {
            Arithmetic obj = new Arithmetic(); // 인스턴스 생성
            ArithmeticDelegate ex1 = new ArithmeticDelegate(obj.Add); // 메서드호출
            System.Console.WriteLine("Add: ex(20, 10) = {0}", ex1(20, 10));
            ex1 = new ArithmeticDelegate(obj.Sub); // Sub메서드 호출
            System.Console.WriteLine("Sub: ex(20, 10) = {0}", ex1(20, 10));
            ex1 = new ArithmeticDelegate(obj.Mul); // Mul메서드 호출
            System.Console.WriteLine("Mul: ex(20, 10) = {0}", ex1(20, 10));
            ex1 = new ArithmeticDelegate(obj.Div); // Div메서드 호출
            System.Console.WriteLine("Div: ex(20, 10) = {0}", ex1(20, 10));

            PrintInfoDelegate ex2 = new PrintInfoDelegate(obj.PrintInfo);
            ex2("델리게이트 예제");
        }
    }
}

주황색부분이 Arithmetic 클래스의 메서드를 호출할 델리게이트를 정의한 것이다.

그리고 Aruthmetic 클래스의 인스턴스를 생성한다.

다음으로 Add()메서드를 호출하기 위해서 ArithmeticDelegate 델리게이트를 사용한다.

시그너처가 동일한 다른 메서드를 호출하고 싶다면 new 연산자를 이용해 해당 메서드를 새로 지정해야 된다.

하지만 동일한 클래스인스턴스를 갖는 객체에서 메서드 시그너처가 다른 메서드를 각각 호출하려면, 호출할 메서드와 시그너처가 일치하는 델리게이트를 사용해야 한다.

이 코드의 결과는 다음과 같다.
Add: ex(20, 10) = 30
Sub: ex(20, 10) = 10
Mul: ex(20, 10) = 200
Div: ex(20, 10) = 2
Arithmetic::PrintInfo = 델리게이트 예제


Comments