https://blog.bitsrc.io/understanding-higher-order-functions-in-javascript-75461803bad

 

Understanding Higher-Order Functions in JavaScript

Learn What Higher-Order Functions are and how to use them in JavaScript

blog.bitsrc.io

 

고차함수 ( High Order Function )

JS를 함수형 프로그래밍에 어울리도록 하는 것이 고차함수이다. JS로 코드를 짜봤으면 자신도 모르게 썼을 가능성이 있다. 흔히 쓰인단다.

고차함수를 이해하기 전에 먼저 함수형 프로그래밍이 뭔지 그리고 일급함수( First-Class Functions )을 먼저 알아야 한다.

 

함수형 프로그래밍이 뭔가 ?

함수를 다른 함수의 파라미터 값으로 보내는 것 그리고 리턴도 함수로 하는것 이라고 간단하게 설명할 수 있다.

함수형 프로그래밍을 지원하는 언어는 JavaScript, Haskell, Clojure, Scala, Erlang 등이 있단다.

 

그럼 일급 함수는 뭔가 ?

JS는 함수들을 일급 시민( First-Class citizens )으로 취급한다. 왜냐면 함수는 객체이기 때문이다. 다른 언어도 같은 이유이다.

JS에서 함수는 그냥 객체가 아니라 함수객체이다. 예를 들면

// 함수 선언
function greeting() {
  console.log('Hello World');
}

// 함수 호출
greeting();  //  'Hello World'

// 객체에 하는 것 처럼 함수에 프로퍼티를 추가할 수 있다.
greeting.lang = 'English';

console.log(greeting.lang);  //  'English'

위의 코드의 경우 그렇게 추천하는 방식은 아니다. 설명하려고 만든 코드이다. 객체를 다뤄야 할 일이 있으면 그냥 객체를 따로 만들어 다뤄야 한다.

object, string, number 등으로 뭔가를 하는 모든것은 함수와 함께 할 수 있다. 이것들을 함수의 파라미터로 보낼 수 있다. 변수에 할당 할 수 도 있다. 이게 함수가 일급 함수인 이유이다.

 

고차함수는 다른 함수에서 인자로 또는 리턴 값으로 작동하는 함수라고 할 수 있다. 

예를 들어 Array.prototype.map, Array.prototype.filter, Array.prototype.reduce는 고차함수의 일부이다.

고차함수를 사용하는 것과 사용하지 않는 예제를 보자

 

- Array.prototype.map

map 메소드는 새로운 배열을 만든다. map은 콜백 함수로부터 모든 리턴 값을 받고 이 값들로 새로운 배열을 만든다.

// 고차함수를 사용하지 않은 코드
const arr1 = [1, 2, 3];
const arr2 = [];
for(let i = 0; i < arr1.length; i++) {
  arr2.push(arr1[i] * 2);
}

console.log(arr2); //  [ 2, 4, 6 ]


// 고차함수를 사용한 코드
const arr1 = [1, 2, 3];
const arr2 = arr1.map(function(item) {
  return item * 2;
});

console.log(arr2); // [ 2, 4, 6 ]

 map, reduce, filter 메서드는 언어 안에 내장된 고차함수이다.

 

고차함수를 직접 만들어보자

const strArray = ['JavaScript', 'Python', 'PHP', 'Java', 'C'];
function mapForEach(arr, fn) {
  const newArray = [];
  for(let i = 0; i < arr.length; i++) {
    newArray.push(
      fn(arr[i])
    );
  }
  return newArray;
}
const lenArray = mapForEach(strArray, function(item) {
  return item.length;
});

console.log(lenArray); //  [ 10, 6, 3, 4, 1 ]

 

 

결론적으로 고차함수는 함수를 인자로 받고 함수를 리턴하는 함수이다. 

+ Recent posts