반응형

✅ 델리게이트(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