티스토리 뷰

개발/JS, TS, React

JS 고차함수

hahagarden 2023. 3. 15. 23:11

일급 객체

비행기의 퍼스트클래스는 특별대우를 받는다. 자바스크립트에도 특별한 대우를 받는 '일급 객체'가 있다. 일급 객체 중 대표적으로 함수가 있다. 일급 객체인 함수는 다음과 같은 특별한 대우를 받는다.

  • 함수를 변수에 할당할 수 있다.
  • 함수는 다른 함수의 전달인자가 될 수 있다.
  • 함수는 다른 함수의 결과로서 반환될 수 있다.

 

고차함수

고차함수는 함수를 전달인자로 받을 수 있거나, 함수를 반환할 수 있는 함수이다. 이 때 어떤 함수(caller)에 전달인자로 전달되는 함수를 콜백 함수(callback function)라고 한다. 어떤 함수(caller)가 완료되었을 때 호출되는 경우가 많아서 '답신 전화'를 의미하는 콜백 함수라는 이름이 붙었다.
이 때 어떤 함수(caller)는 콜백함수를 호출(invoke)할 수도 있고 조건에 따라 콜백함수의 실행여부를 결정하거나, 아예 실행시키지 않거나, 여러번 실행시킬 수 있다.

함수를 반환하는 함수를 따로 부르는 용어가 있다. 함수를 반환하는 함수를 고안해낸 논리학자 하스켈 커리(Haskell Curry)의 이름을 따서 '커링함수'라고 한다. 커링함수라는 용어를 사용할 때에는 고차함수는 '함수를 전달인자로 받는 함수'에만 한정에서 사용한다. 고차함수가 커링함수를 포함한다.

 

자바스크립트에는 내장 고차함수가 있다. 대표적으로는 배열메서드 중 일부인 filter(), map(), reduce() 등이다.

1️⃣ Array.prototype.filter(): arr.filter(callback(element[, index[, array]])[, thisArg])
기존 배열을 mutate하지 않는다.

callback 함수를 통과하며 버려지지 않은 element로 이루어진 새로운 배열을 반환한다.
callback은 각 element를 시험할 함수이다. true를 반환하는 요소를 유지하고 false를 반환하는 요소는 버린다.


2️⃣ Array.prototype.map(): arr.map(callback(currentValue[, index[, array]])[, thisArg])
배열의 각 요소에 callback을 실행한 후의 결과로 이루어진 새로운 배열을 반환한다.

3️⃣ Array.prototype.reduce(): arr.reduce(callback(accumulator, currentValue[, currentIndex[, array]])[, initialValue])
최종 accumulator값이 반환된다. 순회 중 accumulator값이 유지되므로 최종적으로 하나의 값이 반환된다.

accumulator는 callback의 이전 반환값이다. 처음의 accumulator는 initialValue가 전달되었으면 initialValue가 accumulator값이 되고 배열의 첫번째 값부터 currentValue가 되어 순회를 시작하고, initialValue가 전달되지 않았다면 배열의 첫번째 값이 accumulator가 되고 배열의 두번째 값이 currentValue가 되어 순회를 시작한다.
빈 배열에 initialValue를 지정하거나, 요소가 하나뿐인 배열에 initialValue를 지정하지 않은 경우, callback을 호출하지 않고 그 단독값을 반환한다. 빈 배열에 initialValue도 없으면 TypeError가 발생한다.

 

회고

😳😨🙄 모두 오늘의 내 표정이다. 섹션2로 넘어온 첫 날, 갑자기 어려워지고 학습량도 많아져서 매우 당황스러웠다. 32개의 연습문제를 푸는데 잘 모르겠는 것도 스스로 풀려고 하다보니 두 문제는 30분씩 생각해도 떠오르지 않아서 결국엔 답을 먼저 찾아봤다. 막상 답을 보니 할 수 있었던 것 같은데 시간에 쫓기기도 하고 난이도 급상승에 당황해서 더욱 못풀었던 것 같다. 

고차함수와 콜백함수가 무엇인지, 아 이렇게 금방 이해되는 것이었나 싶을 정도로 쉽다. 예전에 콜백함수가 뭔가요 찾아봐도 이렇게 금방 알 수 없었는데.. 코드스테이츠가 쉽고 단순하게 설명해주는 것이 너무 좋다. 초보자가 이해하기 쉽게 비유도 하고 예시도 많이 주면서 알려준다. 그래서 아는 것이 늘어나서 즐겁고, 연습문제도 filter, map, reduce 등을 반복적으로 사용하면서 여러가지 문제를 계속 푸니까 재미있다.

오늘 감기기운에 수업시간에 집중도 잘 못하고 연습문제를 다 못풀었다. 그래도 늦게라도 마무리 했으니 잘한 것이다. 화이팅✌️

 

반응형
댓글