티스토리 뷰

728x90
반응형

고차함수에 대해 소개하기 앞서..!
클로저에 대한 확실한 학습이 필요해요!!
완전 깊숙하게까지는 들어가지 말고✋🏻
클로저 표현 (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)

마지막 줄에서 beforeMappingArrMapping하는걸 볼 수 있어요!
이는, 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이 들어가있으니까, 배열의 모든 원소가 합해진 값만 들어가게 돼요🕊
이 함수의 원리도 다른 고차함수처럼, 하나하나씩 비교해서 합해주는 방식이에요!


  1. 0 + 1을 진행해요 -> 1
  2. (0+1) + 2를 진행해요 -> 3
  3. ((0+1)+2) + 3을 진행해요 -> 6
  4. (((0+1)+2)+3) + 4를 진행해요 -> 10
  5. ((((0+1)+2)+3)+4) + 5를 진행해요 -> 15

이런 식으로 말이죠!


Reducing의 결과로, afterReducingArr에는 15가 저장될 거에요👍🏻





이렇게, 고차함수 (Higher Order Functions, 고계함수)에 대해 정리해봤어요!
인자와 리턴값으로 함수가온다 -> 와 더불어서
어떠한 collection을 재귀적으로 탐색하면서
하나하나씩 진행해 나간다 -> 까지 생각해주면 좋을거 같아요😁


이해가 안되는 부분이나, 틀린 부분이 있으면 코멘트를 남겨주세요!
피드백은 정말정말 환영입니다🎉🎉


Reference

야곰🐻 강의
Wikipedia

728x90
반응형

'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