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 참고하였음.
'C#' 카테고리의 다른 글
C# 구조체, ref, out (6) | 2017.09.18 |
---|---|
C# 인터페이스 (2) | 2017.09.17 |
C# 다형성 (override, overload, implicit, explicit) (0) | 2017.09.15 |
C# 캡슐화, 상속(접근제한자, 프로퍼티, as, is, Object, this, base) (0) | 2017.09.15 |
C# 클래스 (static, 생성자, namespace, Main) (0) | 2017.09.14 |