델리게이트는 메서드에 대한 참조를 캡슐화하는 형식입니다.
풀어쓰면 델리게이트는 메서드를 변수처럼 다룰 수 있게 해주는 객체입니다.
주로 콜백 함수나 이벤트 처리에 사용 됩니다.
델리게이트는 메서드를 변수처럼 다룰 수 있다고 했죠?
이런 특성을 활용하여 동적으로 메서드를 바인딩할 때 유용합니다.
이렇게 되면 조건별로 유연한 이벤트 처리가 가능하게 됩니다.

.NET 에서는 기본적으로 내장 델리게이트를 제공하는데요.
Func , Action , Predicate 가 있습니다.

Func 는 반환값이 있고 제네릭(Generic) 타입의 파라미터를 사용하는 델리게이트 입니다.
아래 코드 기준으로 설명하면 int 파라미터 3개를 받는데요.
여기서 핵심은 마지막 파라미터는 반환 타입을 의미하는 것이라는 거죠.
결과적으로 정수형 파라미터 2개와 정수형 반환 타입 1개로 이루어지는 것 입니다.
() => 이 문법 어디서 본 것 같지 않나요?
맞습니다. 델리게이트는 람다 문법을 사용합니다!
또 하나 사용된 문법이 있는데 익명 함수 입니다.
우리는 만들어져 있는 메소드가 아닌 a+b 라는 익명의 함수를 만들고 델리게이트 변수에 저장한겁니다.
(참고로 Func 는 최대 16개까지 파라미터를 허용합니다.)
// 구현 코드
Func<int, int, int> memoryFunc = (a, b) => a + b;
int a = memoryFunc(1,2); // 결과값 : 3
// Func 메타데이터
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
신기하지 않나요?
메서드를 변수에 저장한 것도 신기한데 익명 함수를 만들어서 변수화 하다니!
델리게이트 변수도 사용해 볼게요.
FuncMethod 라는 연산 함수가 있네요. 파라미터로는 정수 2개를 받고요.
우리는 델리게이트 변수 memoryFunc 가지고 있기에 일반 메서드 파라미터로 사용할 수 있습니다!
int b = FuncMethod(memoryFunc(1, 1), memoryFunc(2, 2)); // 결과값 : 6
public static int FuncMethod(int a, int b)
{
return a + b;
}
Action 는 반환값이 없는 델리게이트입니다.
Func 와 다르게 반환값이 없기 때문에 마지막 파라미터에 반환 타입이 들어가지 않고 모두 파라미터로 사용합니다.
마찬가지로 최대 16개의 제네릭 타입의 파라미터를 사용할 수 있습니다.
Action 델리게이트로 뭘 할 수 있을까 생각하다가 특정 조건일 때 실행되는 메서드를 만들었습니다.
일단 조건은 값이 짝수일 때 실행되도록 하였고 여기서 핵심!!
실행되는 메서드의 파라미터를 타입을 Action 으로 지정했습니다!
결과적으로 조건 -> 메서드 -> 델리게이트 파라미터 -> 델리게이트 실행 순으로 진행됩니다.
Action 을 파라미터 타입으로 받을 수 있는게 재밌네요 ㅋㅋ
int[] ints = {1,2,3,4,5,6,7,8,9 };
Action del_Action1 = () => MM_Method();
foreach (int i in ints)
{
if (i % 2 == 0)
{
GoAction(del_Action1);
}
}
public static void MM_Method()
{
Console.WriteLine("Action Method");
}
public static void GoAction(Action action)
{
action();
}
마지막으로 Predicate 는 조건식을 나타내는 델리게이트로 컬렉션에서 조건에 맞는 요소를 찾거나 필터링할 때 사용합니다.
여기서 말하는 컬렉션은 List, Dictionary, Array 등등 여러 데이터를 저장하는 자료구조입니다.
람다식과 익명함수 기반으로 Predicate 델리게이트를 생성합니다. 조건은 짝수일 경우 true
아래 코드처럼 리스트에 적용하여 데이터 필터 및 필요한 데이터만 추릴 수 있습니다.
public class MemoryMan
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; // List 데이터
Predicate<int> predicate = (x) => x % 2 == 0; // 람다식으로 Predicate 정의, 조건은 짝수 데이터일 경우 true
int getInt = numbers.Find(predicate); // 첫번째 짝수 추출, 결과 : 2
List<int> arrGetInt = numbers.FindAll(predicate); // 결과 : 2,4,6,8
}
}
정리하면 델리게이트의 핵심 개념은 메서드를 변수처럼 다루기 위해 사용하는 것 입니다.
사용 이유는 대표적으로 콜백 메서드 입니다.
콜백 메서드는 다른 메서드에 전달되어 실행되는 메서드로 이때 델리게이트가 많이 사용됩니다.
아래 코드는 파라미터로 델리게이트를 받아서 실행하고 있는데 이런 구조를 콜백 메서드라 합니다.
반환 형태와 파라미터만 동일하다면 델리게이트를 통해 콜백 처리가 가능합니다.
void OrderFood(Action onFoodReady)
{
Console.WriteLine("음식 준비 중...");
// 음식 준비 완료 후 콜백 실행
onFoodReady();
}
public class Program
{
// 1. 델리게이트 정의
public delegate void CallbackDelegate(string result);
// 2. 콜백을 받는 메서드
public static void ProcessData(int number, CallbackDelegate callback)
{
// 처리 로직
string result = $"숫자 {number} 처리 완료";
// 콜백 실행
callback(result);
}
// 3. 콜백으로 사용할 메서드
public static void ShowResult(string message)
{
Console.WriteLine("콜백 메시지: " + message);
}
public static void Main()
{
// 4. 콜백 전달 및 실행
ProcessData(42, ShowResult);
}
}
콜백 메서드 델리게이트 정말 유용할 것 같네요.
오늘도 알아가면서 메모리!
'.NET' 카테고리의 다른 글
| .NET 타스크(Task)란 무엇인가. (0) | 2025.05.27 |
|---|---|
| .NET 람다식(Lambda)란 무엇인가. (0) | 2025.04.10 |
| .NET 데퍼(Dapper)란 무엇인가. (0) | 2025.04.08 |
| .NET 린큐(LINQ) 무엇인가. (0) | 2025.04.07 |
| .NET 의존성 주입(Dependency Injection) 무엇인가. (0) | 2025.03.28 |