고차함수

FAST FOX·2023년 3월 14일
0

학습일지

목록 보기
18/39
post-thumbnail

일급객체

JavaScript에는 다음과 같은 특징을 가지는 일급객체라는 것이 있다.

일급객체의 특징

  1. 변수에 할당(assignment)할 수 있다.
  2. 다른 함수의 전달인자(argument)로 전달될 수 있다.
  3. 다른 함수의 결과로서 리턴될 수 있다.

그리고 그 대표적인 일급객체 중 하나가 함수이다.

함수 중 다른 함수를 인자로 받는 함수를 고차 함수라고 하며 그리고 이렇게 인자로 넘겨주는 함수를 콜백함수라고 한다.

콜백함수를 호출하는 함수는 '함수를 리턴하는 함수'를 고안해 낸 논리학자 하스켈 커리(Haskell Curry)의 이름을 따, 커링함수라고 합니다.

따로 커링 함수라는 용어를 사용하는 경우에는, 고차 함수라는 용어를 '함수를 전달인자로 받는 함수'에만 한정해 사용하기도 합니다. 그러나 정확하게 구분하자면, 고차 함수가 커링 함수를 포함합니다.

• 함수를 인자로 받고 함수를 반환하는 경우

function double(num) {
  return num * 2;
}

function doubleAdder(added, func) {
  const doubled = func(added);
  return function (num) {
    return num + doubled;
  };
}
doubleAdder(5, double)(3); // -> 13
//doubleAdder은 고차함수
//double은 doubleAdder의 콜백함수

const addTwice3 = doubleAdder(3, double);
// doubleAdder가 리턴하는 함수를 변수에 저장할 수 있습니다. (일급 객체)
addTwice3(2); // --> 8

filter(),map(),reduce()

JavaScript에는 기본적으로 내장된 고차 함수가 여럿 있습니다. 그중에서 배열 메서드들 중 일부가 대표적인 고차 함수에 해당합니다.

1.filter

filter 함수의 인자로 함수가 들어갈 수도 있다.

const isOdd = function (num) {
  return num % 2 === 1;
};

let arr = [1, 2, 3, 4, 5, 6, 7];
let output = arr.filter(isOdd);
console.log(output); // [1,3,5,7]

3.reduce

기본적으로 reduce 메서드는 네 개의 인자를 가진다.
1.누산기 (acc)
2.현재 값 (cur)
3.현재 인덱스 (idx)
4.원본 배열 (src)

초기값을 정할 수 있고 정하지 않는다면 배열의 첫번째가 초기값이 된다. 이 초기값이 누적(acc)값의 기반이 되고 누적값과 그 다음 요소(cur)가 함수작용을 하고 다시 그 값이 누적값(acc)이 된다. 그리고 마지막에는 최종 누적값을 반환하게 된다.

const arr = [1, 2, 3];
const result = arr.reduce((acc, cur, idx) => {
  let newAcc = acc + cur;
  return newAcc; // newAcc가 새로운 acc가 되고 그 다음 cur과 함수작용을 한다.
}, 1) // 1 + 1 + 2 + 3 = 7

이 reduce 메서드는 다음과 같이 여러 상황에서 사용이 가능하다.
1. 숫자 더하기
2. 문자열 합치기
3. 작은거 혹은 큰거 비교하기
4. 새로운 함수 만들기


추상화(abstraction)

그래서 이런 고차함수를 왜 써야하는가??
추상화를 통한 효율성을 증대하기 위해서 사용한다!!!

추상화란 복잡한 어떤 것을 압축해서 핵심만 추출한 상태를 말하며
일상생활 뿐만 아니라 JavaScript를 비롯한 많은 프로그래밍 언어 역시, 추상화의 결과입니다.
우리는 JavaScript의 문법(syntax)을 올바르게 사용하는 것만으로, JavaScript가 없었을 때보다 다양한 프로그램을 보다 쉽게 작성할 수 있습니다. 이처럼 고민거리가 줄어들고, 그래서 문제의 해결이 더 쉬워지는 것이 추상화의 이점입니다.

추상화 = 생산성(productivity)의 향상

profile
준비하는 개발자

0개의 댓글