1,2,3,4 단계가 있고 단계마다 함수 호출이 늘어나거나 이전 단계의 함수호출의 범위가 넓어지는
로직을 개발하고 있는데, 단계마다 동일한 함수를 호출 하거나 일률적으로 관리가 어려워
C++ 에서 함수포인터를 Vector에 담아 반복을 돌면서 해당 함수를 호출했던 기억이 있어서
찾다보니 델리게이트 체이닝 개념과 Func<T> Action<> Predicate<T> 각 상황에 맞는 델리게이트를
공부하게되어 기록에 남긴다.
Delegate Basic
Delegate 를 번역해보면 "대리자" 라는 뜻이다. 무엇을 대리를 한다는 것인가?
함수를 호출 하는 호출자의 대리인 역할을 한다. 즉 호출자가 대리자를 호출하면 대리자가 대상 메서드를
대신 호출해 준다. 이러한 간접 호출에 의해, 호출자와 대상 메서드 사이의 결합(coupling)이 끊어진다.
전통적인 프로그래밍 언어에서 말하는 콜백과 비슷하다. 콜백이라는 것은 외부에서 로직의 일부분을 함수로
전달받아 수행하므로 더욱 유연한 구조를 가지게 된다.
1. DETEST 라는 델리게이트를 선언한다 반환값과 매개변수 값을 지정한다.
2. DETEST 라는 델리게이트에 외부로 부터 test1 함수를 주입 해준다.
3. DETEST 델리게이트를 통해 함수를 호출한다.
Delegate Multicast
델리게이트 인스턴스에는 다중 캐스트 기능을 지원한다. 하나의 델리게이트가 하나의 대상 메서드가 아니라
여러 개의 대상 메서드들을 지칭할 수 있다. 대리자 인스턴스에 +나 += 연산자를 이용해 대상메서드를 추가 할 수 있다.
1. DETEST 라는 델리게이트를 선언한다 반환값과 매개변수 값을 지정한다.
2. DETEST 라는 델리게이트에 외부로 부터 test1 함수를 주입 해준다.
3. +, += 연산자를 통해 추가 함수를 주입 해준다.
4. DETEST 델리게이트를 통해 함수 호출
결과를 보면 test1 과 test2가 호출된것을 볼 수 있다 하지만 result 는 12라는 값이 출력 되었다.
다중 캐스트 대리자의 반환 형식이 void가 아니면, 호출자는 마지막으로 호출된 메서드가 돌려준 값을
받게 된다. 마지막 이전 메서드들도 호출 되긴 하지만 반환 값들은 그냥 폐기한다.
그럼 ? 해당 델리게이트의 값을 전부 반환 받으면서 이상이 있는 경우 처리 할 방법은 없는가?
GetInvocationList() 메서드를 사용해서 해당 Delegate[] 받아와 반복문을 돌면서 호출 한다.
.
Func<T> Action<T> Predicate<T>
C# 에서 익명 메서드와 무명 함수는 일회성으로 사용될 함수에 용이하며 코드를 좀 더 간결하게 만들어준다.
하지만 둘 다 대리자(Delegate)가 필요하기 때문에 사전에 대리자를 선언해줘야 한다.
그래서 C# 에서는 이미 상황에 맞게 사용할수 있는 델리게이트를 선언해두었다. 그게 Func<T>, Action,
Predicate<T> 이다. 간단한 예제를 통해 정리해보자.
1. Action<T> : 매개변수 다수 개(MAX 16개) 와 반환값이 void 인 델리게이트
1. Action 델리게이트를 생성하면서 동시에 test3라는 메서드를 추가하고, 람다식을 사용해 무명메서드를 추가한다.
2. Function<T> : 매개변수 다수 개(MAX 16개 ) 와 반환값이 존재하는 델리게이트
1. testFun 델리게이트를 생성하면서 람다식을 사용해 무명메서드를 추가한다.
- Func<T t1, out result >, Func<T t1, T t2, out result>
2. 반환값을 확인한다.
3. Predicate<T> : 매개변수 1개 와 bool 반환값이 존재하는 델리게이트
1. testPredicate 델리게이트를 생성하면서 람다식을 사용해 무명메서드를 추가한다.
2. 반환 값을 명시하지 않아도, bool 값 리턴
마무리
다음 주제에서는 Invoke에 대해 정리하겠습니다.
'프로그래밍 > 개발일지' 카테고리의 다른 글
async - await (0) | 2023.04.04 |
---|---|
Task (0) | 2023.04.03 |
c# Timer 3가지 (0) | 2023.03.23 |
현재 설치 된 프로그램 리스트 가져오기 (2) | 2023.03.22 |
윈도우 어플리케이션 msi 패키징 WIX (2) (0) | 2023.03.19 |