TIL 17일차 고차함수

shleecloud·2021년 8월 10일
0

Codestates

목록 보기
17/95

시작

드디어 고차함수다. Section1 진도를 거의 다 마쳐가는데 남아있는 강의 수가 줄어드는걸보니 지금까지의 여정이 그렇게 짧지만은 않았다는 생각이 든다. 기초만 배웠는데도 뭔가 많이 한 느낌. 아침 9시부터 저녁 10시까지 13시간씩 코딩 생각만 하니까 기간은 짧았지만 체감상으로는 2달정도 지난 느낌이다.

오늘은 고차함수를 배웠다. 이런 사용법도 있구나. 점점 어렵지만 쓸만한 기능들이 나오고있다. 굉장히 편하다. 자바스크립트 핵심개념까진 아니더라도 for문으로 어렵게 비틀어야 되는 내용을 간결하게 표현할 수 있다. 재사용성도 뛰어나서 반복문보다는 이 쪽을 주로 사용할 것 같다.

고차함수

  • 배열 내장 고차함수 filter에 대해서 이해할 수 있다.
  • filter에 대한 이해를 기반으로, 나머지 고차함수를 스스로 학습할 수 있다.
  • forEach, find, filter, map, reduce, sort, some, every
  • 추상화(abstraction)에 대해 설명할 수 있다.
  • 추상화의 관점에서 고차 함수가 갖는 이점에 대해 설명할 수 있다.
  • 고차 함수를 활용하여 프로그램을 작성할 수 있다.

고차함수란?

고차 함수(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) 이라고 한다.
  • 추상화의 개념인데 우리는 자판기를 사용할 때 세세한 동작을 이해할 필요 가 없이 사고와 논리의 뭉치로 이해한다. 자판기에서 음료수를 먹고싶다는 목표를 달성하는데 추상화를 통해서 아주 간단한 절차만으로 달성할 수 있게 만든다.
  • 고차함수는 반복문을 억제해서 변수가 수정될 위험을 억제하고 이 코드가 어떤 내용인지 더 명확하게 알 수 있게 해준다.

고차함수 심화

  • MapReduce 학습하기 (MapReduce Model)
  • 자바스크립트에서 커링(currying)과 클로저(closure)의 차이 이해하기 (js closure vs curry)
  • 선언형 프로그래밍(declarative programming)과 절차형 프로그래밍(imperative programming)의 차이를 배열 메소드를 통해 이해하기 (js imperative vs declarative)
  • 함수의 조합(function composition)에 대해 학습하기 (javascript function composition)

이 부분은 추가로 조사해야 될 것 같다. 방금 위에서 나온 내용도 있고 아닌 내용도 있고. 심화 내용이라 따로 포스팅을 해야겠다.

profile
블로그 옮겼습니다. https://shlee.cloud

0개의 댓글