일반적으로 1급 시민(first-class citizen)의 조건을 다음과 같이 정의한다.
1급 객체(first class object)라는 것은 특정 언어에서 객체(object)를 1급 시민으로써 취급한다는 뜻이다. 당연히 위의 조건을 모두 충족한다.
JavaScript에서는 객체를 1급 시민으로 취급하고, JavaScript에서 함수의 자료형은 객체로 분류되므로 1급 객체라고 볼 수 있다. JavaScript의 함수는 1급 함수의 추가조건도 만족한다.
결론적으로, JavaScript의 함수는 1급 객체(first class object)이다.
JavaScript의 함수가 1급 객체라는 사실이 주는 가장 큰 장점은 바로 고차 함수(high order function)가 가능하다는 점이다. 목적에 따라 적절한 함수를 인자로 넘겨줌으로써 JavaScript의 forEach, filter, map, reduce, sort 등의 배열 메소드 같은 편리한 고차함수들이 가능했던 것이다.
c.f. 1급 함수(first class function)
1급 객체 뿐만 아니라 1급 함수도 존재한다. 함수를 1급 시민으로 취급하는 것이다. 몇몇의 학자들은 1급 시민의 조건과 함께 다음과 같은 추가적인 조건을 요구한다.
- 런타임(runtime) 생성이 가능하다
- 익명(anonymous)으로 생성이 가능하다
자바스크립트에 기본적으로 내장(built-in)되어 있는 고차 함수들 - 배열 메소드들 중 일부가 고차 함수에 해당한다
filter, forEach, find, filter, map, reduce, sort, some, every
✔ 배열 내장 고차함수들의 사용법에 대해서는 따로 정리할 예정이다.
추상화의 다른 말은 요약이다. 복잡한 어떤 것을 압축해서 핵심만 추출한 상태로 만드는 것이 추상화다. 고민거리가 줄어들고, 그래서 문제의 해결이 더 쉬워지는 것이 추상화의 이점이다.
추상화 = 생산성(productivity)의 향상
프로그램을 작성할 때 자주 반복되어 사용되는 로직은 별도의 함수로 작성하기도 하는데, 이는 추상화의 좋은 사례다. 추상화의 관점에서 함수를 바라보면, 함수는 사고(thought) 또는 논리(logic)의 묶음이다.
함수를 통해 얻은 추상화의 단계를 한단계 더 높인 것이 고차함수이다. 함수는 값을 전달 받아, 이 값을 가지고 복잡한 작업을 수행한다. 이는 값 수준에서의 추상화다.
함수 = 값을 전달 받아 값을 리턴한다 = 값에 대한 복잡한 로직은 감추어져 있다 = 값 수준에서의 추상화
고차 함수는 값 수준에서의 추상화를 사고의 추상화 수준으로 끌어올린다.
즉, 우리는 고차함수를 통해 보다 높은 수준(higher order)에서 생각할 수 있고, 생산성을 상승시킬 수 있다.
고차함수 = 함수를 전달 받거나 함수를 리턴한다 = 사고(함수)에 대한 복잡한 로직은 감추어져 있다 = 사고 수준에서의 추상화