자바스크립트의 일급 함수와 고차 함수
2분 읽기
사전 지식:
함수형 프로그래밍,일급 시민
일급 시민 (First Class Citizens)
프로그래밍 언어에서 일급 시민이란 다른 요소들과 차별 없이 동등하게 취급되는 대상을 의미한다. 즉, 변수에 할당하고, 함수의 인자로 전달하고, 함수의 반환값으로 사용할 수 있는 값을 말한다.
일급 시민의 조건
일급 객체를 구성하는 요소 - 로빈 포플스톤(Robin Popplestone)
- 모든 요소는 함수의 실제 매개변수가 될 수 있다.
- 모든 요소는 함수의 반환 값이 될 수 있다.
- 모든 요소는 할당 명령문의 대상이 될 수 있다.
- 모든 요소는 동일 비교의 대상이 될 수 있다.
일급 객체 (First Class Object)
일급 시민의 조건을 만족하는 객체(Object)를 일급 객체라고 한다.
일급 객체가 중요한 이유는, 값을 다루듯 함수를 다룰 수 있게 되면서 함수의 조합과 추상화가 자유로워지기 때문이다. 이는 함수형 프로그래밍의 토대가 된다.
일급 함수 (First-class function)
함수가 일급 함수라면 동시에 일급 객체이며, 일급 시민이기도 하다.
변수에 함수를 할당하거나, 함수 내부에서 함수를 생성하여 반환하는 등 함수가 해당 언어에서 '일급 객체'처럼 다루어질 때 '일급 함수'라고 표현한다. 일부의 경우 일급 함수는 일급 시민의 조건 이외에도 두 가지의 추가적인 조건을 만족해야 한다고 이야기한다.
일급 함수 추가 조건
- 런타임 시 생성이 가능해야 한다.
- 익명으로 생성이 가능해야 한다.
자바스크립트의 함수는 위 조건을 모두 만족하므로 일급 객체다.
자바스크립트는 "멀티 패러다임 프로그래밍 언어"로 명령형, 함수형, 객체지향 프로그래밍을 지향하는 언어이며, 일급 함수의 개념은 함수형 프로그래밍에서 필수적인 키워드이다. 자바스크립트 외에도 클로저와 익명 함수(anonymous function)를 지원하는 여러 언어에서 일급 함수의 개념이 존재한다.
함수가 일급 객체로 취급되기에 가능한 것들
-
함수 표현식
💡 함수를 일급 객체로 취급하는 자바스크립트에서는 변수에 함수를 할당하여 함수 표현식으로 사용할 수 있다.
-
고차 함수(higher-order function)
💡 함수를 파라미터로 전달받거나 연산의 결과로 반환해주는 함수. 콜백 함수(callback function)를 인자로 받는 경우가 대표적이다.
함수형 프로그래밍의 핵심으로, '함수를 리턴하는 함수' (하스켈 커리, Haskell Curry)라는 표현으로도 설명된다. 다른 함수를 아규먼트로 받는 함수를 고차 함수라 명칭한다.
자바스크립트에서 함수는 특별한 타입의 객체인
Function객체로 다루어진다. 함수가 객체로 다루어진다는 것의 예시는 다음과 같다.function greeting() { console.log('Hello World'); } greeting(); // prints 'Hello World' // 객체처럼 함수에도 프로퍼티를 추가할 수 있다. greeting.lang = 'English'; console.log(greeting.lang);물론 function object를 위와 같이 사용해서는 안 된다.
자바스크립트의 내장(built-in) 고차 함수로는 다음과 같은 것들이 있다.
Array.prototype.forEach,Array.prototype.map,find,findIndex,Array.prototype.filter,Array.prototype.reduce,Array.prototype.sort,some,every…💡 왜 고차 함수를 사용할까? → 추상화, 그리고 추상화를 통한 생산성(productivity)의 향상
고차 함수는 함수를 전달받거나 함수를 리턴하고, 함수에 대한 로직은 감춰져 있기 때문에 사고를 추상화 수준으로 끌어올릴 수 있다. 추상화의 수준이 높아지는 만큼 생산성도 높아진다.
-
콜백(callback)
다른 함수의 인자로 전달되어 그 함수 내부에서 호출되는 함수를 콜백 함수라고 한다. 함수가 일급 객체이기 때문에 가능한 패턴으로,
map·filter·forEach와 같은 고차 함수에 동작을 주입하는 방식으로 널리 사용된다.
관련 글
1분 읽기
자바스크립트로 구현하는 힙
힙(Heap) 자료구조의 개념과 Min Heap, Max Heap을 JavaScript와 TypeScript로 구현하는 방법을 정리합니다.
4분 읽기
소수 구하기
소수 판별법과 소수를 구하는 알고리즘을 정리합니다.
1분 읽기
[프로그래머스 Level 2] 미로 탈출
프로그래머스 미로 탈출을 BFS로 풀이합니다.