티스토리 뷰
C# 에서 편리한 기능으로 Delegate 가 있습니다. 비슷한 개념으로는 함수 포인터가 있습니다. Delegate의 여러가지 사용법이 있겠지만 오늘 사용해 본 것은 무엇을 할 것인가 (What)인 함수를 어떻게 할 것인가(How)로 Delegate를 통해 구현해 보았습니다.
1. 트리의 모든 노드를 탐색한다.
트리의 모든 노드를 탐색하기 위하여 재귀함수를 사용했습니다. 루트에서 탐색을 시작하여 루트의 하위 요소가 다른 노드의 부모일 경우 다시 함수를 호출하는 방식으로 트리의 모든 노드를 탐색하였습니다. 무엇을 할 것인가? 모든 트리의 노드를 탐색한다 라는 What의 관점에서 작성된 코드입니다.
소스코드
1 2 3 4 5 6 7 8 9 10 | private void TreeExplorer(TagData root) { foreach (var child in root.Items) { if (child.FileFormat == FileFormat.isFolder) { TreeExplorer(child); } } } | cs |
2. What 의 관점에서 How 의 관점으로
위의 코드는 트리의 모든 노드를 탐색한다는 기능 하나만을 가지고 있습니다. 여기에 How 의 관점으로 코드를 작성하기 위해서 함수의 인자로 Delegate를 넘겨 함수 안에서 사용했습니다. 이렇게 구현된 함수는 인자로 받는 Delegate에 따라 새로운 기능을 할 수 있게 됩니다.
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 | private void TreeExplorer(TagData root, TagData target, Action<TagData, TagData> act) { foreach (var child in root.Items) { act(child, target); if (child.FileFormat == FileFormat.isFolder) { TreeExplorer(child, target, act); } } } | cs |
위의 코드에서 Action은 매번 Delegate를 정의하기는 번거롭기 때문에 미리 정의된 Delegate 형식입니다.
3. 사용 예
이제 How 의 관점에서 함수를 작성했습니다. 이를 사용하는 예를 들어보겠습니다. 모든 트리의 노드를 탐색하는 함수에서 모든 트리의 노드를 탐색하며 트리의 특정 노드를 모아둔 리스트에서 중복되는 노드를 삭제하는 기능입니다.
소스코드
1 2 3 4 5 6 7 8 9 10 | Action<TagData, TagData> act = (TagData child, TagData target) => { foreach (var item in target.Items) { if (item.Items.Contains(child)) { item.Items.Remove(child); } } }; | cs |
Delegate의 값으로 함수의 이름이 올수도 있지만 간단한 기능이기 때문에 람다식으로 작성했습니다.
'Unity > Study' 카테고리의 다른 글
[Unity] 옵저버 패턴 (0) | 2018.07.04 |
---|---|
[Unity] Singleton 패턴 (0) | 2018.06.15 |
[Unity] Coroutine 의 yield return 뒤 함수 확장 (0) | 2018.05.31 |
[Unity] 키 입력 받는 방법 세 가지 비교 (3) | 2018.05.28 |
[Unity] 화면비율 래터박스로 맞추기 (1) | 2018.04.20 |