[JavaScript] 고차 함수

신보연·2023년 3월 14일

일급 객체(First Class Object):

다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

  • 변수에 할당(assignment)
  • 다른 함수의 전달인자(argument)로 전달
  • 다른 함수의 결과로서 리턴
    함수를 변수에 할당할 수 있기 때문에
    함수를 배열의 요소나 객체의 속성 값으로 저장,
    함수를 데이터(string, number, boolean, array, object)처럼 다룰 수 있다.

함수가 일급객체이기 때문에 할 수 있는 것:

  • 고차함수(Higher order function)를 만들 수 있다.
  • 콜백(callback)을 사용.

고차 함수(Higher-Order Function):

함수를 전달인자(argument) 또는 매개변수(parameter)로 받거나 함수를 리턴하는 함수를 말한다.

  • 함수를 인자로 받거나 또는 함수를 반환함으로써 작동 하는 함수.
  • 함수를 출력(output)으로 반환하는(return) 함수.
# func는 익명함수

# 다른 함수를 인자로 받는 경우
function mul(num) { return num * num }

function mulNum(func, num) {
  return func(num);
}

# 함수를 리턴하는 경우
function mul(num1) {
  return function(num2) {
    return num2*num1;
  };
}

# 함수를 인자로 받고, 함수를 리턴하는 경우

콜백함수(callback):

전달인자(Argument)로 받는 함수

// 일반함수
const mul = function(num) { return num * 2 }

// 매개변수(parameter)로 func를 받았고, 함수(func)를 리턴하기 때문에 고차함수
const mulNum = function(func, num) { return func(num) }

// mulNum은 전달인자(argument)로 함수(mul)을 받았으므로 고차함수
// 전달인자(argument)로 받은 함수인 mul은 콜백함수
mulNum(mul, 3) // 6

내장 고차함수

filter:

배열의 요소 중 특정 조건을 만족하는 요소들만 걸러내는 (filter) 메소드

// 아래 코드에서 '짝수'와 '길이 5 이하'는 문법 오류(syntax error)에 해당합니다.
// 의미만 이해하도록 합니다.
let arr = [1, 2, 3, 4];
let output = arr.filter(짝수);
console.log(output); // ->> [2, 4]

arr = ['hello', 'code', 'states', 'happy', 'hacking'];
output = arr.filter(길이 5 이하)
console.log(output); // ->> ['hello', 'code', 'happy']

// 함수 표현식
const isEven = function (num) {
  return num % 2 === 0;
};

let arr = [1, 2, 3, 4];
// let output = arr.filter(짝수);
// '짝수'를 판별하는 함수가 조건으로서 filter 메소드의 인자로 전달됩니다.
let output = arr.filter(isEven);
console.log(output); // ->> [2, 4]

const isLteFive = function (str) {
  // Lte = less then equal
  return str.length <= 5;
};

arr = ['hello', 'code', 'states', 'happy', 'hacking'];
// output = arr.filter(길이 5 이하)
// '길이 5 이하'를 판별하는 함수가 조건으로서 filter 메소드의 인자로 전달됩니다.
let output = arr.filter(isLteFive);
console.log(output); // ->> ['hello', 'code', 'happy']
  • 각 요소를 시험할 함수. true를 반환하면 요소를 유지하고, false를 반환하면 버림.
  • 행동은 내가 직접 작성해야함.
  • 함수로 작성하여 인자로 넣는다.
  • 기존 배열을 수정 ❌
  • 원하는 필터링에 따라 결과가 달라진다.
  • 배열의 각 요소가 특정 논리(함수)에 따르면,
    사실(boolean)일 때 따로 분류(filter).

map:

배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환

const array1 = [1, 4, 9, 16];

// pass a function to map
const map1 = array1.map(x => x * 2);

console.log(map1);
// expected output: Array [2, 8, 18, 32]
  • 행동은 모두 내가 작성해야하며,
    함수로 작성해여 인자로 넣는다.
  • 기존 배열을 수정하지 않는다.
  • 원하는 행동에 따라 결과가 달라진다.
  • 배열의 각 요소가 특정 논리(함수)에 의해
    다른 요소로 지정(map) 된다.

reduce:

배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환.

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10

// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
// expected output: 15
  • 초기값을 정할수 있다. 정하지 않으면 배열의 가장 첫번째 요소가 초기값이 됨.
  • 초기값은 누적값의 기반이 되고 배열의 끝까지 반복.
  • 누적값의 값을 반환(원하는 행동에 의하여 누적값이 바뀐다.)
  • 타입마다 객체의 초기값을 주의❗️
  • 배열의 각 요소를 특정 응축 방법(함수)에 따라
    특정 응축 방법(함수)에 따라 응축(reduction).

0개의 댓글