일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- BFS
- TypeScript
- 타입스크립트
- HTML
- 리액트
- 웹
- 컴퓨터공학
- react
- 자바스크립트
- kubernetes
- JavaScript
- 파이썬
- 이더리움
- es6
- CSS
- next.js
- 블록체인
- docker
- 솔리디티
- node.js
- 백엔드
- 프론트엔드
- 이슈
- 백준
- AWS
- k8s
- 클라우드
- 가상화
- 쿠버네티스
- Today
- Total
즐겁게, 코드
커링은 어려워 본문
커링은 sum(a, b)
처럼 단일 호출로 처리되는 함수를 sum(a)(b)
처럼 여러 번의 호출로 분리하는 기법입니다.
const sum = (a, b) => {
return a + b;
}
console.log(sum(1,2)); // 3
두 수의 합을 구하는 평범한 함수인데요, 위의 sum 함수는 두 인자를 입력받아 계산한 값을 리턴합니다.
그러나 커링을 적용하면 아래처럼 두 인자를 입력받아 계산한 값을 리턴하는 함수를 리턴하게 됩니다.
const curriedSum = (f) => {
return (a) => {
return (b) => {
return f(a, b);
};
};
};
const sum = (a, b) => {
return a + b;
};
let res = curriedSum(sum);
console.log(res(1)(2)); // 3
커링을 이해하기 위해 반드시 기억해야 할 점은 함수에게 중요한 것은 연산에 필요한 인자를 모두 제공받는 것이지, 어떤 과정을 거치는지는 크게 중요하지 않다는 것입니다.
커링의 목적?
커링을 배우면서 든 생각은 '그래서 이게 왜 필요한데?' 였습니다.
커링은 하스켈 이라는 함수형 프로그래밍 언어에서 처음 등장한 기법인데요, 하스켈의 함수는 언제나 한 개의 인자만을 가질 수 있습니다.
따라서 두 개의 수를 더하는 함수를 짜려면 두 개의 함수가 필요한 것처럼 작은 함수의 합성으로 함수를 완성하기 위해 커링이 탄생하게 된 것입니다.
따지고 보면 하스켈의 구조상 f(x, y)
를 계산할 수 없으니 이를 f(g(x))
로 치환하도록 한 것이 커링의 기원같은데, 과연 이런 방식이 얼마나 효과적일지는 아직 잘 와닿지 않네요. 🤣
그래도 특정한 상황에서는 커링을 유용하게 사용할 수 있습니다.
함수의 재사용
const curriedSum = (a) => {
return (b) => {
return (c) => {
return (d) => {
return a + b + c + d;
};
};
};
};
const result1 = curriedSum(1)(2)(3);
console.log(result1(4)); // 10
const result2 = curriedSum(1)(3);
console.log(result2(5)(7)); // 16
단순하면서도 커링을 사용하는 가장 멋진 이유입니다.
커링을 이용한 함수는 각 인자를 전달하는 과정마다 작은 함수로 분리할 수 있는데요, 마치 당구대 홈에 공들을 예쁘게 집어넣듯 원하는 위치에 원하는 인자를 대입할 수 있습니다.
당장은 어디에 써야 할지 막막하더라도(사실 저도 막막합니다) 알면 알수록 모호한 함수형 프로그래밍의 매력에 빠져들 수 있을 것입니다.
TL;DR
- 커링은 단일 호출 함수를 쪼개어 다중 호출 함수로 만드는 기법이다.
- 커링을 사용하면 함수의 직관성 & 재사용성을 확보할 수 있다.
'💬 언어 > Javascript' 카테고리의 다른 글
find, some 메서드로 배열 검사하기 (0) | 2021.02.21 |
---|---|
콜 스택과 이벤트 루프 (0) | 2021.02.20 |
객체 복사하기 (feat. 로대쉬) (0) | 2021.02.13 |
렉시컬 스코프와 클로저 (0) | 2021.02.10 |
이터레이터와 이터러블 (0) | 2021.02.04 |