C# Delegate 완벽 정리: Action, Func, Predicate, EventHandler
C#에서 Delegate(델리게이트)는 메서드를 참조할 수 있는 타입입니다. 쉽게 말해, 메서드를 변수처럼 다룰 수 있게 해주는 기능이죠. 델리게이트는 이벤트(event), 콜백(callback), 람다(lambda) 등 다양한 곳에서 활용되며 C#의 핵심 문법 중 하나입니다.
하지만 매번 델리게이트를 직접 정의하는 것은 번거롭기 때문에,
.NET Framework에서는 자주 쓰이는 형태의 델리게이트를 미리 정의해 제공하고 있습니다.
대표적으로 Action
, Func
, Predicate
, EventHandler
네 가지가 있습니다.
1. Action
Action
은 반환값이 없는 델리게이트입니다.
매개변수는 0개부터 최대 16개까지 받을 수 있습니다.
// 반환값이 없는 Action
Action action = () => Console.WriteLine("Hello Action");
action(); // Hello Action
// 매개변수 2개를 받는 Action
Action<int, string> act2 = (n, s) => Console.WriteLine($"{n}, {s}");
act2(5, "World"); // 5, World
2. Func
Func
은 반환값이 있는 델리게이트입니다.
마지막 타입 매개변수가 반환형을 의미합니다. 매개변수는 0~16개까지 가능합니다.
// 반환값이 int인 Func
Func<int> f1 = () => 100;
Console.WriteLine(f1()); // 100
// 매개변수 2개, 반환값 1개
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 4)); // 7
3. Predicate<T>
Predicate<T>
는 매개변수가 하나이고, 반환값은 항상 bool인 델리게이트입니다.
사실상 Func<T, bool>
과 동일합니다.
Predicate<int> isEven = (x) => x % 2 == 0;
Console.WriteLine(isEven(10)); // True
조건 검사, 필터링, 리스트 검색 등의 상황에서 자주 사용됩니다.
4. EventHandler
이벤트(event) 처리에서 자주 쓰라고 .NET이 기본 제공하는 델리게이트입니다.
표준적인 이벤트 패턴을 따를 때는 EventHandler
나 EventHandler<T>
를 사용합니다.
// EventHandler 기본 형태
public delegate void EventHandler(object sender, EventArgs e);
// 제네릭 EventHandler
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
사용 예시는 다음과 같습니다:
public event EventHandler SomethingHappened;
public event EventHandler<MyEventArgs> CustomEvent;
이처럼 이벤트를 선언할 때 EventHandler
를 사용하면 일관된 이벤트 패턴을 유지할 수 있습니다.
5. 정리
- Action →
void
반환, 매개변수 0~16개 - Func → 값 반환, 매개변수 0~16개 (마지막 인자가 반환형)
- Predicate<T> → bool 반환, 매개변수 1개
- EventHandler / EventHandler<T> → 이벤트 전용 표준 델리게이트
👉 결론적으로, C#에서 델리게이트를 직접 선언할 필요는 거의 없습니다.
대부분의 경우 Action
, Func
, Predicate
, EventHandler
를 활용하면 충분하기 때문이죠.
이렇게 하면 코드의 가독성이 좋아지고, 불필요한 선언을 줄일 수 있습니다.