C# 제네릭 델리게이트: Action·Func·Predicate 선택 기준

C# 제네릭 델리게이트가 필요한 이유와 Action, Func, Predicate의 반환값 차이를 설명합니다. 오래된 예제의 의미는 살리되 현재 기준에서 잘못 적용하기 쉬운 부분을 함께 고쳤어요. 아래 순서대로 확인하면 단순한 화면 복사보다 실제 판단에 도움이 됩니다.

형식 매개변수를 사용한 C# 제네릭 델리게이트 기존 예제
제네릭 델리게이트는 같은 호출 구조를 여러 데이터 형식에 재사용하게 해줍니다.

형식만 다른 델리게이트를 반복하지 않는다

문자열을 출력하는 델리게이트와 정수를 출력하는 델리게이트가 호출 구조는 같고 형식만 다르다면 제네릭으로 묶을 수 있습니다. 형식 매개변수 덕분에 컴파일러가 인수와 반환값의 일치를 확인해요.

delegate TResult Converter<TInput, TResult>(TInput value);

Converter<string, int> length =
    text => text.Length;

Console.WriteLine(length("delegate"));

반환값이 없으면 Action, 있으면 Func

Action<T>는 값을 받아 작업하지만 반환값은 없습니다. Func<T, TResult>는 마지막 형식 매개변수가 반환 형식이에요. 조건을 검사해 bool을 돌려주는 용도에는 Predicate<T>도 있지만, LINQ와 함께 쓸 때는 Func<T, bool>이 더 자연스러운 경우가 많습니다.

예를 들어 화면에 메시지를 쓰는 작업은 Action, 문자열을 숫자로 바꾸는 변환은 Func, 목록에서 조건에 맞는 항목을 찾는 검사는 Predicate로 읽으면 구분이 쉽습니다.

직접 선언할 때는 의미 있는 이름을 준다

기본 제공 Action과 Func만으로 대부분의 콜백을 표현할 수 있습니다. 하지만 ref·out 매개변수가 필요하거나, 호출의 업무 의미를 형식 이름으로 드러내야 한다면 사용자 정의 델리게이트가 낫습니다. 공개 API에서는 단순한 형식보다 이름이 사용 의도를 설명해 주기도 해요.

빠른 선택반환 없음은 Action, 반환 있음은 Func, bool 조건은 Predicate 또는 Func<T,bool>, 특별한 시그니처나 이름이 필요하면 사용자 정의 delegate를 선택하세요.

형식 매개변수가 많아지면 별도 형식을 검토한다

Func<T1,T2,T3,TResult>처럼 형식이 길어지면 호출 목적보다 매개변수 목록이 먼저 보입니다. 이때 입력을 하나의 레코드나 클래스로 묶거나 의미 있는 사용자 정의 델리게이트 이름을 주면 API를 읽기 쉬워져요. 무조건 기본 제공 형식을 쓰는 것이 목표는 아닙니다.

델리게이트는 여러 메서드를 결합할 수도 있지만 반환값이 있는 멀티캐스트 델리게이트는 마지막 호출의 결과만 남습니다. 모든 결과가 필요하다면 호출 목록을 명시적으로 순회하거나 컬렉션과 반복 구조로 설계해 의도를 드러내는 편이 안전합니다.

예제를 직접 확인하는 순서

코드를 그대로 읽는 데서 끝내지 말고 작은 콘솔 프로젝트에 옮겨 정상 입력과 잘못된 입력을 각각 실행해 보세요. 컴파일 오류와 실행 중 예외는 원인이 다릅니다. 경고가 표시되면 무시하지 말고 사용 중인 .NET과 C# 언어 버전도 확인합니다.

예제의 이름과 출력 문장은 바꿔도 핵심 형식과 호출 구조는 유지해야 해요. 한 줄씩 수정하면서 결과가 왜 달라지는지 기록하면 문법을 외우는 것보다 오래 남습니다. 운영 코드에 적용하기 전에는 null, 빈 값, 예상 범위를 벗어난 값도 별도 테스트로 확인하세요.

자주 묻는 질문

기존 글의 게시일과 URL은 바뀌나요?

아니요. 이 글은 기존 게시물을 보완한 것이며 원래 공개 URL을 유지합니다.

화면이 글과 다르면 어떻게 하나요?

서비스 화면과 메뉴는 바뀔 수 있으므로 글의 원리와 공식 문서를 먼저 확인하고 현재 화면에서 같은 기능명을 찾으세요.

한 번 설정하면 다시 확인하지 않아도 되나요?

버전·정책·환경이 바뀔 수 있습니다. 업데이트나 스킨 변경 뒤에는 핵심 동작을 다시 점검하는 편이 안전합니다.

공식 자료

이 글은 기존 게시물의 URL과 기록 가치를 유지하면서 현재 독자가 실행할 수 있도록 내용을 다시 확인해 보완했습니다.

댓글 쓰기

0 댓글