프로그래밍/C#

delegate 표현 방식들

selinatsu 2024. 10. 19. 12:33
반응형

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