커링(Currying) 기법의 이해와 사용, 그리고 장단점
커링(Currying)은 카레와 같은 스펠링을 갖고 있지만 그 유명한 하스켈(Haskell)이라는 이름의 출처인 수학&논리학자 하스켈 브룩스 커리(Haskell Brooks Curry)의 성(Family Name)입니다.
커링은 하나 이상의 매개변수(Parameter)를 갖는 함수를 부분적으로 나누어 각각 단일 매개변수를 갖는 함수로 설정하는 기법입니다.
식으로 설명하면 다음과 같습니다.
func(a, b, c) -> f(a)(b)(c)
위 식을 코드로 변경하면 함수를 리턴하면서 다음 매개변수를 받아 또 함수를 리턴합니다.
//non-curried function plusFunc(a, b, c){ console.log(a + b + c); } plusFunc(1, 2, 3); // 6 //curried function plusFunc(a){ return function(b){ return function(c){ console.log(a + b + c); } } } plusFunc(1)(2)(4); // 7
논커리와 커리의 차이를 확인해 보겠습니다.
non-curried : 함수 실행 시 파라미터가 모자라도 문제 없이 실행이 가능함
👉 함수 정의 : func(a, b, c)
👉 함수 실행 : func(a)
👉 실행 결과 : func(a, undefined, undefined)
curried : 함수가 인수를 전부 받을 때까지 실행을 보류함.
👉 함수 정의 : func(a, b, c)
👉 함수 실행 : func(a)
👉 실행 결과 : func(a)상태에서 b 함수 입력 대기
위 특징에 따라 다음과 같이 사용할 수 있습니다.
function setAppell(appell){ return function(name) { console.log(appell + name); } } const setName = setAppell('Mr.'); setName('Right'); // Mr.Right setAppell('Mr.')('Baker'); //Mr.Baker //ES6 화살표 함수 const setAppell = appell => name => console.log(appell + name); const setName = setAppell('Miss.'); setName('Dior'); // Miss.Dior
또한 다음과 같이 이벤트와 파라미터를 동시에 전달할 때도 유용합니다.
const setNumber = (num) => (event) => { console.log(event.target.id+':'+num); } <div onClick="setNumber(2)(event)" id='myNum'> click </div> // myNum:2
그럼 커링의 장점을 요약하면 무엇이 있을까요?
장점👍
– 재사용 가능
– 생산성 향상(코드 양 감소)
– 가독성 향상
그렇다면 커링의 단점은 무엇일까요?
단점👎
– 함수가 깊이 깊이 중첩되면 메모리를 과다하게 점유할 가능성이 있는 것과 같은 맥락에서 커링을 과용하면
메모리와 속도에 문제점 발생 가능성이 있음
커링을 사용하지 않아도 원하는 기능을 대부분 구현할 수 있지만 재사용성이나 가독성에 따른 생산성 향상을 위해 커링을 사용하면 좋은 효과를 기대할 수 있습니다. 커링을 직접 구현하지 않더라도 커링의 개념과 사용법에 대해 알아두면 다른 사람의 코드를 읽거나 로직을 이해하는데 큰 도움이 될 것이라 생각합니다.