JavaScript/함수형 프로그래밍

[JavaScript]함수형 프로그래밍 - 고차 함수

DevStory 2021. 8. 14.

함수형 프로그래밍에서 고차 함수(high order function) 통칭 HOF가 존재합니다.

 

고차 함수 다른 함수를 인자로 받거나 또는 함수를 반환하거나 방금 말한 두 가지를 모두 수행하는 함수입니다. 

 

이번 포스팅에서는 고차 함수에 대해 정리합니다.


다른 함수를 인자로 받음

다른 함수를 인자로 받는 함수는 Array.map, Array.filter, Array.reduce와 같은 함수들이 존재합니다.

 

즉, 위 3개의 함수는 고차 함수입니다.

 

filter 함수를 예로 설명합니다.

아래 코드는 배열의 요소에서 'Korean'이 아닌 요소들을 모아서 새로운 배열을 반환합니다.

var language = [
  'Korean',
  'English',
  'German'
];

var filterArr = language.filter(function(item) {
  return item !== 'Korean'
});

console.log(filterArr);
// ["English", "German"]

 

filter 함수는 다음 함수를 인수로 받았습니다.

function(item) {
  return item !== 'Korean'
}

 

MDN 사이트에서 filter 함수를 검색해보면, filter 함수 안에 callback 함수를 인수로 받는다고 설명합니다.

 

☞ callback 함수란?

 

callback 함수를 인수로 받는 함수들은 고차 함수입니다.

MDN에서 filter 함수 설명

 

고차 함수를 직접 개발할 수도 있습니다.

useCheck 함수는 1개의 값과 2개의 함수를 인수로 받습니다.

값이 'Y'이면, fnTrue 함수를 호출하며, 값이 'Y'가 아닐 경우 fnFalse 함수를 호출합니다.

function useCheck(useYN, fnTrue, fnFalse) {
  return useYN === 'Y' ? fnTrue() : fnFalse()
}

function fnTrue() {
  console.log('use is Y');
}

function fnFalse() {
  console.log('use is N');
}

useCheck('Y', fnTrue, fnFalse);
// use is Y

다른 함수를 반환

커링(currying)은 고차 함수 사용볍과 관련된 함수형 프로그래밍 기법입니다. 

 

여러 개의 인수를 가지는 함수를 하나의 인수를 가지는 함수로 나누는 기법입니다.

 

아래 함수를 나누어 다른 함수를 반환하는 고차 함수를 만들어봅시다.

두 개의 인수를 받아 더한 값을 반환하는 아주 심플한 코드입니다.

function add (a, b) {
  return a + b;
}

 

위 코드는 아래 코드처럼 함수를 나누어 사용할 수 있습니다.

var add = function(x) {
  return function(y) { 
    return x + y
  };
};

var addTen = add(10);

 

add 함수에 10을 전달하면, add 함수는 다음과 같이 처리됩니다.

var add = function(10) {
  return function(y) { 
    return 10 + y
  };
};

 

add(10)은 값을 반환하는 것이 아니라 함수를 반환합니다.

function(y) { 
  return 10 + y
};

 

즉, 변수 addTen는 add(10)이 반환하는 함수입니다.

변수 addTen은 함수처럼 사용을 해야 합니다.

아래 코드는 addTen을 함수처럼 사용하여 5를 전달합니다.

addTen(5);

 

addTen(5)이 호출하는 함수는 아래와 같습니다.

function (5) { 
  return 10 + 5
};

 

전체 코드입니다.

var add = function(x) {
  return function(y) { 
    return x + y
  };
};

var addTen = add(10);

console.log(addTen(5));
// 15

 

도대체 왜 이런 기법을 사용하는 걸까요?

위에서 설명한 코드는 커링된 함수를 설명하기 위해 작성한 코드라서 실질적으로 좋은 코드는 아닙니다.

 

그리고 함수를 계속 나누다 보면, 커링 지옥을 경험하게 될 것입니다.

 

그럼에도 불구하고 왜 이런 기법을 사용할까요?

 

커링된 함수의 장점은 제가 찾아본 결과 세 가지가 존재합니다.

  1. 재사용성
  2. 코드를 추적
  3. 비용이 많이 드는 작업을 분할하여 처리

그 외에도 여러 가지 장점이 있겠지만, 다른 함수를 반환하는 고차 함수에 대한 의견은 분분합니다.


마무리

이번 포스팅에서는 고차 함수에 대해 알아보았습니다.

 

함수를 매개변수로 전달하는 고차 함수는 저도 가끔 사용하는 방법입니다.

 

다른 함수를 반환하는 고차 함수는 글쎄요...

 

굳이? 함수를 나눠서? 만들어야 하나?라는 생각이 듭니다.

 

내가 고차 함수로 코드를 작성했는데, 고차 함수를 모르는 팀원이 있을 경우 팀원이 제 코드를 바로 이해할 수 있을지 의문입니다.

반응형

댓글