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

C# 제네릭 대리자(Generic Delegate)란? 개념부터 예제까지 총정리

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# 코드를 작성할 수 있습니다.