본문 바로가기

C#

C# delegate (콜백, 체인, 범용성)

반응형

C# 델리게이트(delegate)

: C#에서 메서드를 가리킬 수 있는 타입

(C++의 함수 포인터, 함수형프로그래밍에서 일급 함수와 유사하다.)

delegate로 선언한 타입이 메서드를 가리키기 때문에

그 메서드를 직접 호출하는 것 대신에 delegate로 그 메서드를 호출할 수 있다.

- 메서드를 직접호출하면되지 왜 굳이 delegate를 사용해서 호출할까? 는 잠시 후에..


1. delegate 만들기

 delegate가 어떤 메서드를 가리키기 때문에 그 메서드와 동일한 매개변수와 리턴타입으로 선언해야한다.

1
2
3
4
5
6
7
선언 구문
=> 접근제한자 delegate 대상_메서드의_반환타입 타입명(대상_메서드의_매개변수들..);
(예시에선 접근제한자 생략)

delegate void Type1(void);  // void func1(void)
delegate int Type2(int,int); // int func2(int, int)
delegate string Type3(double); // string func3(double)
delegate float Type4(int); // float func4(int)


* 너무도 간단하다. 앞에 delegate를 붙이고 내가 원하는 타입이름(Type1, Type2, ..)을 쓰고 매개변수만 똑같이 맞춰주면 끝!

2. delegate 사용

delegate는 '타입' 이기 때문에 int, string, char, ... 처럼 사용한다.

1
2
3
4
5
6
7
Type1 F1Delegate;
F1Delegate = new Type1(func1);
Type2 F2Delegate;
F2Delegate = new Type2(func2);
Type3 F3Delegate = func3; // C# 2.0부터 사용가능
int      a       = 5;
 


int a = 5; 처럼 그냥 메서드 넣고, 그 메서드 호출하면 된다.

F1Delegate(); , F2Delegate(5,5); , F3Delegate(3.14);

* 타입명에 관례적으로 접미사 Delegate를 붙임. 안 붙여도 상관없으나 다 이유가 있다.


간단한 실제 사용 예제


이걸 왜 쓸까? 결론부터 말하면 '콜백(CallBack)메서드'에서 활용하면 드라마틱하다.

콜백

: A라는 메서드를 호출할 때, B라는 메서드를 매개변수로 넘겨주고 A메서드에서 B 메서드를 호출하는 것

이 상황에서 A메서드를 '콜백메서드' 라고 한다. (밑의 예제에서 확인)

- 콜백은 메서드를 호출하는 것이기 때문에 실제 필요한 것은 타입이 아니라 하나의 메서드다.

따라서 타입 자체를 전달해서 실수를 유발할 여지를 남기기보다 메서드에 대한 delegate만 전달해서 이 문제를 해결할 수 있다.

이제는 원하는 메서드를 같이 매개변수로 넘겨주어 해당 기능을 수행한다.

Calc라는 메서드 A가 콜백메서드가 된다. Plus, Minus라는 메서드B를 A에서 호출하니까.


범용성을 고려한 일반화

제네릭 <T>를 이용해서 어떤 타입이든 사용가능한 메서드를 만들었다.

구현에서 object타입을 이용할 수도 있다.


delegate 체인

지금까지본 delegate 인스턴스는 하나의 메서드만 가리키고 있었는데 여러개를 가리키는 것도 가능하다.

특이하게 += 연산자를 이용해 delegate 인스턴스를 추가한다.

마찬가지로 -= 연산자를 이용해 인스턴스를 삭제할 수있다.

( 이 모든게 C# 컴파일러의 배려..... )

https://mrw0119.tistory.com/19 , 책 시작하세요 C#프로그래밍 6.0 참고하였음.

반응형