티스토리 뷰
고차함수에 대해 소개하기 앞서..!
클로저에 대한 확실한 학습이 필요해요!!
완전 깊숙하게까지는 들어가지 말고✋🏻
클로저 표현 (Closure Expressions)
후위 클로저 (Trailing Closures)
요 두가지면 충분합니다😁
이전에 고차함수(고계함수)에 대해 간략히 정리한 글이 있는데,
Closure-3
조금 사실은 매우많이 미흡하지만😅 참고하셔도 좋을거 같아요!
전달인자로, 반환 값으로 사용할 수 있는 함수
우리는 클로저를 알기 때문에,
변수나 상수에 함수를 할당할 수 있다는걸 알아요!
그럼, 변수나 상수가 인자로 혹은 반환 값으로 들어가니까
함수도 그게 가능하겠구나! 할수있겠죠??😲
대표적인 함수로는 map()
, filter()
, reduce()
가 있습니다!
✅ map
위키피디아에서는 map()
에 대해
"전해진 함수를 배열의 모든 요소에 적용(apply)하여 그 결과 배열을 전달하는 고차함수" 라고 표현합니다.
예를 들어봅시다📝
let square = { (number: Int) -> Int in
return number * number
}
let beforeMappingArr = [1, 2, 3, 4, 5]
let afterMappingArr = beforeMappingArr.map(square)
마지막 줄에서 beforeMappingArr
를 Mapping
하는걸 볼 수 있어요!
이는, beforeMappingArr
배열의 각 원소 하나하나씩을 square
라는 클로저에 통과시켜서afterMappingArr
에 넣는 과정이라고 생각하면 돼요😲
Mapping
의 결과로, afterMappingArr
에는 [1, 4, 9, 16, 25]가 저장될 거에요👍🏻
✅ filter
말 그대로, "특정 조건에 만족하는 친구를 걸러주는 함수" 입니다!
(굉장히 직관적인 이름이에요😄)
예를 들어봅시다📝
let even = { (number: Int) -> Bool in
return number % 2 == 0
}
let beforeFilteringArr = [1, 2, 3, 4, 5]
let afterFilteringArr = beforeFilteringArr.filter(even)
요렇게 해주면, beforeFilteringArr
에서 짝수인 원소만 걸러서 afterFilteringArr
에 넣어줘요🕊
Filtering
의 결과로, afterFilteringArr
에는 [2, 4]가 저장될 거에요👍🏻
✅ reduce
위키피디아에서는 reduce()
에 대해
"재귀적인 자료 구조를 분석하고,
전달받은 결합된 명령들을 사용하여 재결합하며,
재귀적으로 수행된 그 결과들로 반환 값(return value)을 만들어내는 고차함수" 라고 표현합니다.
(이 함수는 reduce
, accumulate
, compress
혹은 inject
등 다양하게 알려져 있지만, 보통은 Fold
라고 표현한다고 해요😲)
예를 들어봅시다📝
let sum = { (num1: Int, num2: Int) -> Int in
return num1 + num2
}
let beforeReducingArr = [1, 2, 3, 4, 5]
let afterReducingArr = beforeReducingArr.reduce(0, sum)
reduce()
의 갈호 첫번째에 들어가는건 초기값을 의미해요!
지금은 0이 들어가있으니까, 배열의 모든 원소가 합해진 값만 들어가게 돼요🕊
이 함수의 원리도 다른 고차함수처럼, 하나하나씩 비교해서 합해주는 방식이에요!
- 0 + 1을 진행해요 -> 1
- (0+1) + 2를 진행해요 -> 3
- ((0+1)+2) + 3을 진행해요 -> 6
- (((0+1)+2)+3) + 4를 진행해요 -> 10
- ((((0+1)+2)+3)+4) + 5를 진행해요 -> 15
이런 식으로 말이죠!
Reducing
의 결과로, afterReducingArr
에는 15가 저장될 거에요👍🏻
이렇게, 고차함수 (Higher Order Functions, 고계함수)에 대해 정리해봤어요!
인자와 리턴값으로 함수가온다 -> 와 더불어서
어떠한 collection을 재귀적으로 탐색하면서
하나하나씩 진행해 나간다 -> 까지 생각해주면 좋을거 같아요😁
이해가 안되는 부분이나, 틀린 부분이 있으면 코멘트를 남겨주세요!
피드백은 정말정말 환영입니다🎉🎉
Reference
'Swift' 카테고리의 다른 글
URLSession (0) | 2021.05.20 |
---|---|
LLDB(Low-Level Debugger) (0) | 2021.04.15 |
값 캡쳐 (Capturing Values) (0) | 2021.03.25 |
후위 클로저 (Trailing Closures) (0) | 2021.03.25 |
클로저 표현 (Closure Expressions) (0) | 2021.03.23 |