드디어 고차함수다. Section1 진도를 거의 다 마쳐가는데 남아있는 강의 수가 줄어드는걸보니 지금까지의 여정이 그렇게 짧지만은 않았다는 생각이 든다. 기초만 배웠는데도 뭔가 많이 한 느낌. 아침 9시부터 저녁 10시까지 13시간씩 코딩 생각만 하니까 기간은 짧았지만 체감상으로는 2달정도 지난 느낌이다.
오늘은 고차함수를 배웠다. 이런 사용법도 있구나. 점점 어렵지만 쓸만한 기능들이 나오고있다. 굉장히 편하다. 자바스크립트 핵심개념까진 아니더라도 for문으로 어렵게 비틀어야 되는 내용을 간결하게 표현할 수 있다. 재사용성도 뛰어나서 반복문보다는 이 쪽을 주로 사용할 것 같다.
고차 함수(higher order function)는 함수를 인자(argument)로 받을 수 있고, 함수의 형태로 리턴할 수 있는 함수입니다.
이전 콘텐츠에서 확인했듯이, 함수는 변수에 저장할 수 있습니다. 그리고 함수는, 함수를 담은 변수를 인자로 전달받을 수 있습니다. 마찬가지로, 함수 내부에서 변수에 함수를 할당할 수 있습니다. 그리고 함수는 이 변수를 리턴할 수 있습니다. 여기서 변수에 할당하지 않고 함수를 바로 이용할 수 있습니다. 어떤 고차 함수에 함수를 인자로 전달하고, 고차 함수는 함수 자체를 리턴합니다. 변수가 빠졌을 뿐, 동일하게 동작합니다.
이때 다른 함수(caller)의 인자(argument)로 전달되는 함수를 콜백 함수(callback function)라고 합니다. 콜백 함수의 이름은, 어떤 작업이 완료되었을 때 호출하는 경우가 많아서, 답신 전화를 뜻하는 콜백이라는 이름이 붙여졌습니다.
콜백 함수를 전달받은 고차 함수는, 함수 내부에서 이 콜백 함수를 호출(invoke) 할 수 있습니다. caller는 조건에 따라 콜백 함수의 실행 여부를 결정할 수 있습니다. 아예 호출하지 않을 수도 있고, 여러 번 실행할 수도 있습니다. 특정 작업의 완료 후에 호출하는 경우는 이후에 충분히 접할 수 있습니다.
'함수를 리턴하는 함수'는 모양새가 특이한 만큼, 부르는 용어가 따로 있습니다. '함수를 리턴하는 함수'를 고안해 낸 논리학자 하스켈 커리(Haskell Curry)의 이름을 따, 커리 함수라고 합니다. 따로 커리 함수라는 용어를 사용하는 경우에는, 고차 함수란 용어를 '함수를 인자로 받는 함수'에만 한정해 사용하기도 합니다. 그러나 정확하게 구분하자면, 고차 함수가 커리 함수를 포함합니다. 이번 유닛부터는 '함수를 리턴하는 함수'와 '함수를 인자로 받는 함수' 모두, 용어를 고차 함수로 사용합니다.
추릴려고 했는데 다 중요한 내용이라서 다 가져와버렸다. 용어를 바르게 알고 쓰는걸 중요하게 생각한다. 정확히 무얼 지칭하는지 알면 그 이후로 보이게 되고 쓸 수 있게 된다. 다 중요한 내용이잖아??? 몇번을 봐도 괜찮은 내용이다.
// 함수들을 입력받아 함수들이 입력된 차례대로 결합된 새로운 함수를 리턴해야 합니다.
function pipe(...funcArr) {
// 배열에 있는 함수를 순서대로 적용시킨다.
return function(num) {
return funcArr.reduce(function (arr, cur) {
return arr = cur(arr);
}, num)
}
}
그리고 꽤 어려웠던 pipe문제. 함수에 함수를 씌우는걸 반복하는 문제다. for문으로 풀었다가 reduce로도 할 수 있겠거니 싶었던 문제. 이게 정말 근본 문제인게 원하는 함수들을 배열 형태로 묶어서 이 함수에 넣으면 조합해서 리턴해준다. 2를 더하고 2를 곱하는 함수를 만들거나 먼저 2를 곱하고 2를 더하는 함수를 만든다던지. 원하는대로 조합할 수 있다. 멋있다.
고차 함수는 외부 상태 변경이나 가변(mutable) 데이터를 피하고 불변성(Immutability)을 지향하는 함수형 프로그래밍에 기반을 두고 있다.
함수형 프로그래밍은 순수 함수(Pure function)와 보조 함수의 조합을 통해 로직 내에 존재하는 조건문과 반복문을 제거하여 복잡성을 해결하고 변수의 사용을 억제하여 상태 변경을 피하려는 프로그래밍 패러다임이다.
명시적 프로그래밍(declarative programming)
이라고 한다. 이 부분은 추가로 조사해야 될 것 같다. 방금 위에서 나온 내용도 있고 아닌 내용도 있고. 심화 내용이라 따로 포스팅을 해야겠다.