Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 대리자(Delegate)를 인스턴스화하는 방법

C#에서 new 키워드를 사용하면 대리자(delegate)를 인스턴스화할 수 있습니다. 대리자를 생성할 때 new 표현식에 전달되는 인수는 메서드 호출과 비슷한 형태로 작성하지만, 메서드의 매개변수는 생략합니다.

기본적인 대리자 인스턴스화

다음은 new 키워드로 대리자를 인스턴스화하는 기본 예제입니다.

public delegate void printString(string s);
printString ps1 = new printString(WriteToScreen);

익명 메서드를 사용한 인스턴스화

대리자는 익명 메서드(anonymous method)를 통해서도 인스턴스화할 수 있습니다.

//delegate 선언
delegate void Del(string str);

Del d = delegate(string name) {
    Console.WriteLine("Notification received for: {0}", name);
};

전체 예제

이번에는 대리자를 선언하고 인스턴스화하는 완전한 예제를 살펴보겠습니다. 아래 코드에서는 두 개의 정적 메서드(AddNum, MultNum)을 각각 다른 대리자 인스턴스에 연결한 뒤, 대리자 객체를 통해 메서드를 호출합니다.

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl {

    class TestDelegate {

        static int num = 10;
        public static int AddNum(int p) {
            num += p;
            return num;
        }
        public static int MultNum(int q) {
            num *= q;
            return num;
        }
        public static int getNum() {
            return num;
        }
        static void Main(string[] args) {
            //대리자 인스턴스 생성
            NumberChanger nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);

            //대리자 객체를 사용하여 메서드 호출
            nc1(25);
            Console.WriteLine("Value of Num: {0}", getNum());
            nc2(5);
            Console.WriteLine("Value of Num: {0}", getNum());
            Console.ReadKey();
        }
    }
}

실행 결과

Value of Num: 35
Value of Num: 175

실행 결과를 보면 nc1(25) 호출 시 AddNum 메서드가 실행되어 값이 10에서 35로 증가했고, 이어서 nc2(5) 호출 시 MultNum 메서드가 실행되어 35에 5가 곱해져 175가 된 것을 확인할 수 있습니다. 이처럼 대리자를 활용하면 메서드 자체를 변수처럼 다룰 수 있어 코드의 유연성이 크게 향상됩니다.