방프리
20.03.29 Chapter1. C# 언어 요소 (Item 7) 본문
Item 7: 델리게이트를 이용하여 콜백을 표현하라
우선은 델리게이트가 무엇이고, 콜백이 무엇일까?
콜백(CallBack)은 영어 뜻대로 다시 호출하는 것을 말한다. 특정 이벤트가 발생했을 때에만 호출한다는 것인데
주로 비동기적으로 처리하는 서버에서 많이 사용한다.
단일 쓰레드로 콜백으로만 호출하여 서버를 구축하는 방법도 있다고 한다.
(현재 공부하고 있는 NodeJS도 콜백 형식으로 이루어진 언어라고 한다.)
각 언어마다 콜백을 표현하는 방법은 다르다. C#에서는 이 콜백을 델리게이트(delegate)라는 키워드를 통해 구현이
가능하다.
(이 콜백도 디자인 패턴 중 옵저버 패턴 (Observer Pattern)으로 구현되어 있다.)
델리게이트를 사용함으로써 클래스 간의 결합도를 낮출 수 있다. 즉, 클래스 간의 개입이 줄어든다는 뜻이다.
.Net Framework 라이브러리는 좀 더 다양한 함수를 지원함으로서 여러 방식의 델리게이트를 사용할 수 있는데
Predicate<T>, Action<>, Func<> 가 이에 해당한다.
위의 세 개의 함수는 동작하는 방식은 같으나 (틀리면 댓글로 지적 부탁드립니다.) 매개변수 혹은 반환값의 유무에 따라
사용하는 함수가 달라진다.
위의 함수의 내용은 꽤 많아서 나중에 따로 테스트를 하며 정리를 해볼 생각이다.
(솔직히 유니티에서도 많이 사용하면서 이해가 안되는 부분이 많다.)
LingQ가 Action<>의 개념을 기반으로 만들어졌다고 한다.
List는 콜백을 사용하는 다양한 메서드를 가지고 있는데 위의 코드에서 사용한 Find(), TrueForAll(), RemoveAll(),
ForEach()가 있다.
Find()는 Predicate<int>형식의 델리게이트를 사용해 리스트 내에 조건문에 부합하는 요소를 반환한다.
TrueForAll()는 Find() 함수와 유사하게 작동하는데 모든 항목이 조건문에 부합하면 true, 아니면 false를 반환한다.
RemoveAll()는 델리게이트에서 정의한 조건 (조건식)에 부합하는 모든 요소를 삭제한다.
ForEach()는 리스트 내의 모든 요소에 대해 델리게이트로 지정한 동작을 수행한다. 위의 코드의 경우 요소를 콘솔에
출력하는 코드를 넣었기 때문에 실행 시 numbers 안에 있는 모든 요소를 출력한다.
LingQ는 델리게이트를 기반으로 동작한다. 또한 모든 델리게이트는 기본적으로 멀티캐스트를 제공한다.
하지만 주의할점은 예외처리에 델리게이트는 약하다.
다음 함수는 유니캐스트 델리게이트 형태에는 문제가 없지만 멀티캐스트 델리게이트에서는 오류를 낸다.
델리게이트의 반환값은 멀티캐스트 체인에서 마지막으로 호출된 함수의 반환값이 되며 다른 반환값은 무시된다.
위의 코드는 개별메서드가 true를 반환한 다음 다음 메서드에 대한 호출을 이어간다.
델리게이트는 런타임에 콜백을 구성하는 최고의 방법이라고 작가는 말한다.
유니티에서도 델리게이트 함수를 굉장히 많이 제공하고 있기 때문에 C# 언어를 사용하는 사람들은 꼭 숙지하고
넘어가야 하는 부분이라 생각한다.
'C# > Effective C#' 카테고리의 다른 글
20.04.15 Chapter1. C# 언어 요소 (Item 9) (0) | 2020.04.15 |
---|---|
20.04.14 Chapter1. C# 언어 요소 (Item 8) (0) | 2020.04.14 |
20.03.26 Chapter1. C# 언어 요소 (Item 6) (0) | 2020.03.28 |
20.03.25 Chapter1. C# 언어 요소 (Item 5) (0) | 2020.03.26 |
20.03.24 Chapter1. C# 언어 요소 (Item 4) (0) | 2020.03.24 |