C#에서 제네릭 대리자(Generic Delegate)는 형식 매개변수(type parameter)를 가지는 대리자로, 하나의 선언만으로 여러 데이터 타입에 대응할 수 있는 강력한 기능입니다. 또한 System 네임스페이스에는 이미 정의된 제네릭 대리자들이 포함되어 있어, 별도의 대리자 선언 없이도 바로 사용할 수 있습니다.
제네릭 대리자 선언 방법
제네릭 대리자는 일반 대리자와 달리 형식 매개변수를 꺾쇠괄호(<>) 안에 지정하여 선언합니다.
delegate T MyDelegate<T>(T n);
여기서 T는 실제 사용 시점에 구체적인 타입(int, double, string 등)으로 대체됩니다.
C# 제네릭 대리자 예제
다음은 C#에서 제네릭 대리자를 선언하고 사용하는 전체 예제입니다.
using System;
delegate T MyDelegate<T>(T n);
namespace GenericDelegateAppl {
class TestDelegate {
static int num = 5;
// 두 값을 더하는 메서드
public static int AddNum(int p) {
num += p;
return num;
}
// 두 값을 곱하는 메서드
public static int MultNum(int q) {
num *= q;
return num;
}
// 현재 num 값을 반환하는 메서드
public static int GetNum() {
return num;
}
static void Main(string[] args) {
// 제네릭 대리자 인스턴스 생성
MyDelegate<int> nc1 = new MyDelegate<int>(AddNum);
MyDelegate<int> nc2 = new MyDelegate<int>(MultNum);
// 대리자 객체를 통해 메서드 호출
nc1(50);
Console.WriteLine("num의 값: {0}", GetNum());
nc2(10);
Console.WriteLine("num의 값: {0}", GetNum());
Console.ReadKey();
}
}
}
실행 결과
num의 값: 55
num의 값: 550
코드 설명
delegate T MyDelegate<T>(T n);— 형식 매개변수 T를 받는 제네릭 대리자를 선언합니다.MyDelegate<int> nc1 = new MyDelegate<int>(AddNum);— int 타입으로 특정화한 대리자 인스턴스를 생성하고 AddNum 메서드를 참조합니다.nc1(50);— 대리자를 통해 AddNum(50)이 호출되어 num은 55가 됩니다.nc2(10);— MultNum(10)이 호출되어 num은 550이 됩니다.
기본 제공 제네릭 대리자: Func, Action, Predicate
.NET에서는 자주 사용되는 제네릭 대리자를 미리 제공하기 때문에 매번 직접 선언할 필요가 없습니다.
- Func<T, TResult> — 매개변수를 받아 값을 반환하는 메서드를 참조합니다. 마지막 형식 매개변수가 반환 타입입니다.
- Action<T> — 값을 반환하지 않는(void) 메서드를 참조합니다.
- Predicate<T> — bool을 반환하는 조건 검사 메서드를 참조합니다.
// Func 사용 예제
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 출력: 25
// Action 사용 예제
Action<string> print = msg => Console.WriteLine(msg);
print("Hello, C#!");
정리
제네릭 대리자를 활용하면 타입별로 대리자를 중복 선언할 필요 없이 코드의 재사용성과 유지보수성을 크게 높일 수 있습니다. 특히 Func, Action, Predicate 같은 기본 제공 제네릭 대리자를 적극적으로 활용하면 더 간결하고 가독성 좋은 C# 코드를 작성할 수 있습니다.