C#의 대리자(Delegate)는 C나 C++의 함수 포인터와 유사한 개념입니다. 대리자는 메서드에 대한 참조를 저장하는 참조 형식 변수로, 런타임에 참조 대상을 변경할 수 있다는 특징이 있습니다.
대리자 선언 방법
대리자는 다음과 같은 문법으로 선언합니다.
delegate <반환 타입> <대리자 이름> <매개변수 목록>
대리자를 선언할 때는 해당 대리자가 참조할 메서드와 동일한 반환 타입과 매개변수를 지정해야 합니다. 이렇게 하면 시그니처가 일치하는 모든 메서드를 대리자를 통해 호출할 수 있습니다.
대리자 인스턴스화 방법
대리자 타입을 선언한 후에는 new 키워드를 사용하여 대리자 객체를 생성하고, 특정 메서드와 연결해야 합니다. 이때 new 표현식에 전달되는 인수는 메서드 호출과 비슷하게 작성하지만, 실제 메서드의 인수는 생략합니다.
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);
위 예제에서 하나의 대리자 타입으로 서로 다른 두 메서드(WriteToScreen, WriteToFile)를 참조할 수 있음을 확인할 수 있습니다.
전체 예제 코드
다음은 C#에서 대리자를 선언하고 인스턴스화하는 전체 예제입니다.
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
코드 설명
위 예제의 동작 흐름은 다음과 같습니다.
NumberChanger라는 대리자 타입이 정수를 매개변수로 받아 정수를 반환하는 메서드를 참조할 수 있도록 선언되었습니다. Main 메서드에서는 AddNum 메서드를 참조하는 nc1과 MultNum 메서드를 참조하는 nc2, 두 개의 대리자 인스턴스를 생성합니다.
nc1(25)를 호출하면 AddNum이 실행되어 num 값이 10에서 35로 증가하고, 이어서 nc2(5)를 호출하면 MultNum이 실행되어 35에 5가 곱해져 최종적으로 175가 출력됩니다.
이처럼 대리자를 활용하면 메서드 자체를 매개변수처럼 전달할 수 있어, 콜백 처리나 이벤트 기반 프로그래밍 등 다양한 상황에서 유연한 코드 작성이 가능합니다.