✅ 델리게이트(Delegate)란?
📌 델리게이트는 메서드를 참조할 수 있는 타입이다.
쉽게 말하면, **"함수를 변수처럼 다루기 위한 문법"**이야.
C#에서 함수 자체는 변수에 담을 수 없지만,
델리게이트를 통해 **함수(메서드)를 가리키는 참조(주소)**를 저장하고 호출할 수 있어.
✅ 왜 쓸까?
델리게이트는 다음과 같은 상황에서 유용해:
- 콜백 함수 구현
- 이벤트(Event) 처리
- 전략(Strategy) 패턴처럼 동작의 유연한 교체
- 다형성 없이 다양한 함수 호출 처리
✅ 델리게이트 기본 선언 및 사용
// 1. 델리게이트 선언
delegate void PrintDelegate(string message);
// 2. 사용할 메서드
void PrintHello(string msg)
{
Console.WriteLine("Hello " + msg);
}
// 3. 델리게이트 변수 생성 및 할당
PrintDelegate printer = PrintHello;
// 4. 델리게이트 호출 (함수처럼 사용 가능)
printer("재은"); // Hello 재은
✅ 델리게이트의 중요한 특징
특징 | 설명 |
형식 안전 | 델리게이트는 선언된 시그니처(매개변수 타입, 반환형)를 따라야 함 |
멀티 캐스트 가능 | 여러 메서드를 델리게이트에 연결할 수 있음 (+=, -=) |
익명 함수, 람다와 호환 | delegate 키워드 또는 lambda 표현식으로 할당 가능 |
✅ 익명 메서드 & 람다식으로 쓰기
🔸 익명 메서드
PrintDelegate printer = delegate(string msg)
{
Console.WriteLine("Hello " + msg);
};
🔸 람다식
PrintDelegate printer = (msg) => Console.WriteLine("Hello " + msg);
✅ 델리게이트 종류
종류 | 설명 |
일반 델리게이트 | 위에서 직접 선언한 것 |
Action<T> | 반환값이 없는 델리게이트 (void) |
Func<T, TResult> | 반환값이 있는 델리게이트 |
Predicate<T> | bool을 반환하는 델리게이트 |
✅ Action, Func, Predicate 예시
Action<string> sayHi = (name) => Console.WriteLine($"Hi, {name}");
Func<int, int, int> sum = (a, b) => a + b;
Predicate<int> isEven = (num) => num % 2 == 0;
sayHi("재은"); // Hi, 재은
Console.WriteLine(sum(3, 5)); // 8
Console.WriteLine(isEven(4)); // true
✅ 멀티캐스트 델리게이트 (여러 메서드 연결)
delegate void Notifier();
void A() => Console.WriteLine("A 호출");
void B() => Console.WriteLine("B 호출");
Notifier notify = A;
notify += B;
notify(); // A 호출, B 호출
✅ 델리게이트 vs 이벤트
항목 | 델리게이트 | 이벤트(Event) |
접근 | 외부에서 자유롭게 호출 가능 | 외부에서 직접 호출 불가 |
목적 | 콜백, 전략 패턴 등 | 이벤트 처리 전용 |
사용 위치 | 일반 메서드 전달 등 | 주로 UI, 버튼 클릭, 상태 변화 |
✅ 정리 요약
항목 | 설명 |
델리게이트 | 메서드를 참조할 수 있는 타입 |
사용 목적 | 콜백, 이벤트, 유연한 함수 실행 |
문법 | delegate, Action, Func, Predicate |
특징 | 형식 안전, 멀티캐스트 가능, 람다 지원 |
❓
델리게이트란 함수를 변수처럼 사용하는것도 알겠고 람다식을 이용하면 더 쉽게 잘 사용할 수 있는것도 알겠다 근데
=> 이표시가 무슨 표시인지를 모르겠다.. 물어보니까 람다 연산자라고 하는데 자세히 알아봅시다!
✅ => 는 뭐야?
"goes to", 혹은 "이 함수는 이렇게 작동해!" 라고 해석하면 좋아.
(parameters) => expression_or_statement_block
이 구조는 람다식(lambda expression) 이라고 불리는 문법으로,
익명 함수(이름 없는 함수)를 만들기 위한 간결한 문법이야.
✅ 예시로 설명
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 5)); // 출력: 8
- (a, b) → 매개변수
- => → 람다 연산자
- a + b → 반환할 표현식 (return 생략 가능)
→ 위 코드는 "a와 b를 받아서 a + b를 반환하는 함수" 를 만들고, add에 담은 거야.
❓
Func<int, int, int> add = (a, b) => a + b;
이 부분이 하나도 이해가 안된다.. 어떻게 저렇게 나온거지?...한번 물어보겠습니다
✅ 코드 다시 보기
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 5)); // 출력: 8
✅ 이건 무슨 뜻일까?
💡 한 줄 해석:
add라는 이름의 "함수 변수"를 만들고,
이 함수는 int 2개를 받아서 int 하나를 반환하는 함수야.
즉, 이건 아래 함수와 같은 의미야:
int Add(int a, int b)
{
return a + b;
}
하지만 Func<int, int, int>을 사용하면,
함수를 변수처럼 담아서, 더 유연하게 쓸 수 있어.
✅ 코드 완전 해부
부분 | 의미 |
Func<int, int, int> | 매개변수 2개 (int, int), 반환값 int인 함수 타입 |
(a, b) | 매개변수 |
=> | 람다 연산자 |
a + b | 반환할 값 (return 생략 가능) |
❓
아 이 부분에서 제가 궁금했던 Func<int, int, int>가 나오네요! 매개변수 2개를 사용하는 int인 함수 타입이라고 하네요!!!
궁금증 해결! 완전 해소됐네여!! 굳!!!!
=> 이 연산자도 그냥 람다 연산자니 외우던지..해야겠네여ㅎㅎ..
근데 확실히 더 코드가 간결해지고 이쁘게 쓸 수 있는듯 하네여
✅ 일반 함수와 비교
// 일반적인 함수 정의
int Add(int a, int b)
{
return a + b;
}
이걸 변수에 저장해서 쓸 수 있도록 만든 게 바로:
Func<int, int, int> add = (a, b) => a + b;
이제 add(3, 5) 하면 → a=3, b=5 → a + b = 8
✅ 다른 예시로 익혀보기
1️⃣ 문자열 길이 구하는 함수
Func<string, int> getLength = s => s.Length;
Console.WriteLine(getLength("hello")); // 5
- 매개변수 1개 (string)
- 반환값: int
2️⃣ 두 수의 곱 구하는 함수
Func<int, int, int> multiply = (x, y) => x * y;
Console.WriteLine(multiply(4, 6)); // 24
3️⃣ 인사 출력하는 Action (반환 없음)
Action<string> greet = name => Console.WriteLine("Hi, " + name);
greet("재은"); // Hi, 재은
✅ 요약
문법 | 의미 |
Func<T1, T2, TResult> | 입력 T1, T2 → 출력 TResult 함수 |
Action<T> | 입력 T → 반환값 없음 (void) |
(x, y) => x + y | 람다식으로 함수 정의 |
✅ 다양한 형태의 예시
1. 표현식 람다 (한 줄)
Func<int, int> square = x => x * x;
→ x를 받아서 x * x를 반환하는 함수
2. 문장 블록 람다 (여러 줄)
Action<string> greet = name => {
Console.WriteLine("안녕!");
Console.WriteLine("나는 " + name);
};
→ name을 받아서 여러 문장을 실행하는 함수
✅ 어떤 상황에서 쓰여?
- 델리게이트에 함수 전달할 때
- LINQ 쿼리에서 (Where(x => x > 0))
- 이벤트 핸들러
- 간단한 콜백 함수
✅ 정리
기호 | 의미 |
=> | 람다 연산자. "함수 정의는 이렇게!" |
(x) => x * 2 | x를 받아서 x * 2를 반환하는 함수 |
이렇게 델리게이트와 람다 연산자에 대해서 알아봤는데여 굉장히 흥미롭고 재밌네요!!ㅎㅎ
궁금증도 풀렸고 재밌는 공부가 됐습니다! 앞으로 유니티 개발할때 자주 사용하면 좋겠네여!
'C#' 카테고리의 다른 글
C# - Adapter Pattern(어댑터 패턴) + 예제 (1) | 2025.07.04 |
---|---|
C# - goto (0) | 2025.07.04 |
C# - Queue(큐) vs Stack(스택) + 메모리구조 (2) | 2025.07.04 |
C# - List vs Array(리스트 vs 배열) (1) | 2025.07.04 |
C# - Collection(컬렉션) (0) | 2025.07.04 |