고차함수
고차함수는 함수를 입력받아서 함수를 반환하는 함수를 말한다. 즉, 홤수 실행이 완전히 끝날때 까지 최소한 두 단계에 걸친 매개변수가 존재한다. (완전히 완료되기 전에 여러 번 호출 되어야 함)
const mergeInformation = (a, b) => information => {
const {aName, aAge} = a
const {bAddress, bNumber} = b
const default = {
aName,
aAge,
bAddress,
contact: bNumber
}
return information => {
return {...default, ...information}
}
}
// 1.
mergeInformation(a, b)(information)
// 2.
const makeMergeInformation = mergeInformation(a, b)
makeMergeInformation(program)
makeMergeInformation(exhibit)
부분적용함수 (particial application)
위 코드의 2번 소스를 보면 makeMergeInformation가 첫 번째 함수 호출의 반환값을 가지고 있다. 이를 변수에 할당하여 이 결과 일부를 가지고 있는 함수가 된다. 이렇게 고차 함수를 한 번 호출하면 계속해서 사용할 수 있는 새로운 함수가 반환되기 때문에 재사용하기 좋다.
정리하자면, 총 n개의 매개변수를 받는 함수가 있는데 미리 m개의 매개변수만 넘겨서 기억시킨다. (위 코드상 makeMergeInformation) 추후 나머지 n - m 개의 매개변수를 넘기면 (위 코드상 makeMergeInformation(program), makeMergeInformation(exhibit) 부분) 원래 함수의 실행 결과를 얻게 된다.
커링 (currying)
커링이란 한 번에 인수 하나만 받는 함수를 일컫는다. 부분적용함수와 비슷하여 혼동될 수도 있는데 공통점으로는 원래필요한 인수보다 인수가 적은 함수를 반환하여 인수를 줄인다는 것이다. 하지만 부분적용함수는 3개의 매개변수가 필요한 함수에 매개변수 2개를 먼저 전달했다면 여기서 반환된 함수에는 매개변수가 1개가 필요하다.
반면에 커링의 경우 매개변수 3개가 필요 하다면, 먼저 매개변수 하나를 받는 고차함수가 다른 함수를 반환하고, 반환된 함수도 매개변수를 하나 받는다. 이 함수를 끝으로 매개변수 하나를 받는 마지막 함수가 반환된다.
function getDogNames(dogs, filterFunc) {
return dogs
.filter(filterFunc)
.map(dog => dog[name])
}
const weightCheck = weight => dog => dog[weight] < weight
getDogNames(dogs, weightCheck(20))
getDogNames(dogs, weightCheck(50))
getDogNames 함수는 모든 형태의 비교 함수를 받을 수 있기 때문에 비교를 위한 값을 하드코딩할 필요 없이 weightCheck(20), weightCheck(50) 처럼 사용할 수 있다.
커링 함수를 사용하면 여러 지점에서 다양한 매개변수를 전달할 수 있다. 또한, 함수를 데이터로 전달할 수도 있다.
const identity = field => value => dog => dog[field] === value
const colorCheck = identity('색상')
const stateCheck = identity('지역')
getDogNames(dogs, colorCheck('갈색'))
getDogNames(dogs, stateCheck('서울'))
첫 번째 함수는 비교 대상을 지정한다 (색상이나 지역같은), 그 후 다음 함수에서 비교할 값을 전달한다. (갈색이나 서울 같은) 그리고 마지막 함수는 개별 강아지에 대한 정보를 받게 된다.
'Javascript' 카테고리의 다른 글
netlify에 client 어플리케이션 배포하기 (0) | 2021.03.08 |
---|---|
Heroku에 node.js 서버 배포하기 (1) | 2021.03.08 |
async / await (0) | 2020.11.27 |
프로미스 (0) | 2020.11.27 |
비동기 프로그래밍 (0) | 2020.11.27 |
댓글