1. Delegate 타입을 사용한 기본적인 대리자(Delegate) 선언
기본적으로, 대리자(Delegate)를 선언하고 함수를 대입하는 방식은 다음과 같습니다
delegate void MyDelegate(); // 대리자 선언
void MyMethod() // 대리자로 호출할 함수
{
Console.WriteLine("MyMethod 호출됨");
}
MyDelegate delFunc = MyMethod; // 대리자에 함수 대입
delFunc(); // 호출: 출력 -> MyMethod 호출됨
여기서 **delegate void MyDelegate();**는 반환값이 없고 매개 변수가 없는 대리자를 선언하는 코드입니다.
**MyDelegate delFunc = MyMethod;**는 이 대리자 타입 변수에 MyMethod라는 함수를 대입하는 방식입니다.
이 방식은 매우 명시적이며, 우리가 흔히 알고 있는 대리자의 형태입니다.
2. 익명 대리자(Anonymous Delegate)
하지만, C#에서는 대리자를 정의할 때 **익명 함수(Anonymous Function)**를 바로 대입할 수도 있습니다.
이때 delegate 키워드를 사용하여 익명 대리자를 만들 수 있습니다.
익명 대리자는 이름이 없는 함수입니다.
바로 이 경우가 Action myAction = delegate { ... }라는 코드입니다.
delegate void MyDelegate(); // 대리자 선언
// 익명 대리자를 직접 대입
MyDelegate myDelegate = delegate
{
Console.WriteLine("익명 대리자 함수 호출!");
};
// 대리자를 통해 익명 함수 호출
myDelegate(); // 출력: 익명 대리자 함수 호출!
또는 아래와 같이 사용할 수도 있습니다.
Action myAction = delegate
{
Console.WriteLine("익명 함수 호출됨");
};
myAction(); // 출력: 익명 함수 호출됨
여기서 delegate 키워드는 대리자를 선언하는 것이 아니라, 익명 대리자를 생성하는 데 사용됩니다.
이 코드는 별도의 메소드를 선언하지 않고도 직접 익명 함수를 대리자에 할당하는 방식입니다.
즉, 대리자를 선언하고 별도의 메소드를 대입하는 것 대신, 함수를 즉석에서 정의하고 할당하는 방법입니다.
익명 대리자와 기존 대리자의 차이
기존 대리자 방식
먼저 대리자 타입을 선언하고, 대리자에 연결할 메소드를 따로 정의한 후, 그 메소드를 대리자에 할당하는 방식입니다.
익명 대리자 방식
익명 함수를 사용하여, 메소드를 따로 정의하지 않고 대리자에 바로 함수 내용을 할당하는 방식입니다.
<일반 대리자 사용>
delegate void MyDelegate();
void MyMethod()
{
Console.WriteLine(" MyMethod 호출됨");
}
MyDelegate delFunc = MyMethod; // 메소드 대입
delFunc(); // 호출: 출력 -> MyMethod 호출됨
<익명 대리자 사용>
delegate void MyDelegate();
MyDelegate myDelegate = delegate
{
Console.WriteLine("익명 대리자 함수 호출!");
};
myDelegate(); // 출력: 익명 대리자 함수 호출!
익명 대리자를 사용하는 경우, 함수 이름을 정의할 필요 없이 함수의 본문만 바로 작성할 수 있어서 간결하게 코드를 작성할 수 있습니다.
익명 대리자 대신 람다 표현식 사용
익명 대리자 방식은 C#에서 람다 표현식이 나오기 전 방식으로, C#의 람다 표현식이 익명 대리자보다 더 간단하고 읽기 쉽기 때문에 더 많이 사용됩니다.
사실 람다 표현식도 익명 함수의 한 종류 라고 볼 수 있습니다.
위 예시를 람다 표현식으로 작성하면 이렇게 됩니다
// 1. 대리자 타입 선언 (기존과 동일)
delegate void MyDelegate();
// 2. 람다 표현식을 사용한 대리자 할당
MyDelegate myDelegate = () => Console.WriteLine("람다 표현식으로 익명 함수 호출!");
// 3. 대리자를 통해 함수 호출
myDelegate(); // 출력: 람다 표현식으로 익명 함수 호출!
람다 표현식이 익명 대리자보다 더 간결하고 직관적입니다.
결론
delegate 키워드는 **익명 대리자(Anonymous Delegate)**를 생성하는 데 사용됩니다.
익명 대리자는 별도의 메소드 이름 없이 바로 대리자에 함수 내용을 정의하는 방식입니다.
이 방식은 기존 대리자 선언 후 메소드를 대입하는 방식과 달리, 간단한 함수 처리가 필요할 때 유용합니다.
람다 표현식이 등장하면서, 익명 대리자는 람다 표현식으로 대체되는 경우가 많습니다.
'프로그래밍 > C#' 카테고리의 다른 글
Action 의 다양한 형태들 (0) | 2024.10.19 |
---|---|
클로저와 람다 표현식 (0) | 2024.10.19 |
delegate 와 Action 그리고 Func (0) | 2024.10.19 |
클로저 (Closure) (0) | 2024.10.19 |
Lazy<T> 에 대한 조금 더 깊이있는 이해 (1) | 2024.10.14 |