SEB[JS/Node : 고차함수]

Jogi's 코딩 일기장·2021년 7월 7일
0

부트캠프 24일차를 통해서 JS/Node에서 고차함수 대해서 공부를 했다. 고차함수라고 해서 처음 겪는 보는 것들인 줄 알았는데, 고차함수인지 모르고 쓰는 것과 새로운 것들도 있었다. 그래도 이들을 사용해서 우리가 편리하게 사용할 수도 있고 잘 알면 중요하다고도 하니 배웠던 개념 정리와 함께 느낀점들을 작성해보겠다.

고차함수(Higher order function)

일급 객체(first-class citizen)

  • 일급 객체는 특별한 대우를 받는 객체를 말하며, 그 중 하나가 함수이다.

  • javascript에서는 함수를 아래와 같이 취급한다.

    • 변수에 할당할 수 있다.
    • 다른 함수의 인자로 전달될 수 있다.
    • 다른 함수의 결과로서 리턴될 수 있다.
  • 함수 표현식은 선언식과 다르게 호이스팅이 적용되지 않는다. 호이스팅을 지나치게 의존하면, 코드의 유지보수가 어려워질 수 있기 때문에 표현식을 쓸 때가 있다.

고차함수?

  • 함수를 인자로 받을 수 있고, 함수의 형태로 리턴할 수 있는 함수
  • 다른 함수의 인자로 전달되는 함수를 콜백함수라고 부른다.
  • 콜백함수를 전달받은 고차함수는 함수 내부에서 호출(invoke)할 수 있다.
  • 함수를 리턴하는 함수를 커리함수라고 하는데, 고차함수는 함수를 인자로 받고 함수를 리턴하는 함수이다. 그렇기 때문에 커리함수가 고차함수의 부분적인 개념이라고 할 수도 있다.
    • 다른 함수를 인자로 받는 경우
    • 함수를 리턴하는 경우
    • 함수를 인자로 받고, 함수를 리턴하는 경우

Javascript에 내장된 고차함수

  • filter, map, reduce를 다뤘지만 이 외에도 forEach, find, sort, some, every같은 내장 고차함수들이 있다.

내장 고차함수(filter, map, reduce)

filter

  • 모든 배열의 요소들 중에서 특정 조건을 만족하는 요소를 걸러내는 메소드다.

  • 걸러내는 기준이 되는 특정조건은 함수의 형태이며, filter 메소드의 인자다.

  • 걸러내기 위한 조건을 명시한 함수를 인자로 받기 때문에 고차함수이다.

  • 배열의 각 요소가, 특정논리(함수)에 따라 사실(boolean)일 때, 따로 분류한다.(filter)

    arr_protoType.filter(function(e) {
    	조건식(true or false)
    })
    or
    arr_protoType.filter(e => 조건식) // 리턴의 경우만 있다면

map

  • 배열의 각 요소가, 특정논리(함수)에 의해, 다른 요소로 지정(map)한다. (모든요소)
    arr_protoType.map(function(e) {
    	가공
        return e;
    })
    or
    arr_protoType.map(e => 가공식) // 리턴의 경우만 있다면

reduce

  • 배열의 각 요소를, 특정방법(함수)에 따라, 원하는 하나의 형태로, 응축한다(reduce)
    arr_protoType.reduce(function(acc, cur) {
    	acc = ~~~~
        return acc;
    }, 0)
    or
    arr_protoType.reduce((acc, cur) => ???) // 리턴의 경우만 있다면

추상화

  • 복잡한 어떤 것을 압축해서 핵심만 추출한 상태로 만드는 것이 추상화이다.
  • 이는 생산성(productivity)의 향상이라 할 수 있다.
  • 추상화의 관점에서 함수는 사고 또는 논리의 묶음이다.
    • 일반 함수
      • 값을 전달받아 값을 리턴한다. => 값에 대한 복잡한 로직은 감추어져 있다. => 값 수준에서의 추상화
    • 고차 함수
      • 함수를 전달받거나 함수를 리턴한다. => 사고(함수)에 대한 복잡한 로직은 감추어져 있다. => 사고 수준의 추상화

실습

github 실습 자바스크립트 파일
실습은 페어 프로그래밍으로 진행됐으며, 문제에 대해 파악하고 풀어보는 시간을 가졌다. 뭔가 이것저것 섞어가면서 하려니 머리가 터질것 같았지만 그래도 해낼 수가 있었다. filter와 map은 그래도 사용할만 해진 것 같지만, 아직 reduce에 대한 이해가 더 필요해 보인다.

마치며

이번 유닛에서는 고차함수에 대한 개념들을 숙지하고 실습 위주로 사용법을 익히는 것이 목표같았다. 실습에서 느꼈던 것과 같이 filter와 map은 사용법이 어느정도 잘 숙지가 됐지만, reduce는 알다가도 모를 것이 초기화값과 누산이 되는 것이 잘 이해가 되지 않았던 것 같다. 이번에는 reduce에 대해서 조금 더 알아봐야 할 것 같다. 그래도 간만에 생각을 깊게 해볼만한 문제들이 있어서 좋았던 것 같다. 하루하루 발전해 나가자!

Reference

  • 코드스테이츠 강의자료
profile
프로그래머로서의 한걸음

0개의 댓글