자바스크립트 일급 객체(First-class Function)란?
자바스크립트에서 함수를 설명할 때 ‘일급 객체’라는 용어를 사용한다. 이는 변수에 저장하거나 다른 함수의 인자로 전달하고, 함수의 반환값으로도 사용할 수 있는 객체를 뜻한다. 자바스크립트의 함수는 이처럼 다른 값과 같은 방식으로 다룰 수 있고(일급), 그 자체로 객체이기도 하므로 일급 객체에 해당한다.
개념
- 프로그래밍 언어에서 값은 저마다 다룰 수 있는 방식이 정해져 있다.
- 어떤 값은 변수에 담거나, 함수에 넘기거나, 함수의 결과로 돌려받을 수 있다.
-
숫자와 함수를 같은 방식으로 저장·전달·반환하는 예시이다.
function identity(value) { return value; // 전달받은 값을 그대로 반환 } const number = 10; // 숫자를 변수에 저장 const returnedNumber = identity(number); // 숫자를 전달하고 반환받음 console.log(returnedNumber); // 10 const greet = () => "안녕하세요"; // 함수를 변수에 저장 const returnedFunction = identity(greet); // 함수 자체를 전달하고 반환받음 console.log(returnedFunction()); // "안녕하세요" -
identity(greet)는 함수 자체를 전달한다.identity(greet())라고 쓰면greet를 먼저 실행한 결과인 문자열을 전달한다.
-
- 이처럼 값을 변수에 저장하고 인자로 전달하거나 반환값으로 사용할 수 있는 성질을 일급(first-class)이라고 한다.
- 자바스크립트(JS)에서는 숫자, 문자열, 객체뿐 아니라 함수도 이 조건을 만족한다. 즉, 일급이다.
- 그래서 JS 함수를 일급 객체, 또는 일급 함수라고 표현한다.
일급 함수가 되기 위한 네 가지 조건
- 일급 함수 특징을 네 가지로 정리하면 다음과 같다.
- 첫째, 런타임에 생성할 수 있어야 한다.
- 둘째, 변수나 자료구조(객체, 배열)에 저장할 수 있어야 한다.
- 셋째, 함수의 매개변수로 전달할 수 있어야 한다.
- 넷째, 함수의 반환값으로 사용할 수 있어야 한다.
- 네 조건은 '함수를 다른 값과 같은 방식으로 다룰 수 있는가'라는 하나의 질문으로 모인다고 볼 수 있다.
조건별 예시
-
먼저 함수는 런타임에 함수 표현식으로 만들어 변수에 담을 수 있다.
const add = function (a, b) { return a + b; }; -
JS 함수는 변수뿐 아니라 객체나 배열 같은 자료구조에도 저장할 수 있다.
// JS 함수 const add = function (a, b) { return a + b; }; const calculator = { add }; // 객체에 저장 const ops = [add, (a, b) => a - b]; // 배열에 저장 -
JS 함수는 다른 함수의 인자로 전달할 수도 있다.
[1, 2, 3].map(function (n) { return n * 2; }); // [2, 4, 6] -
함수를 인자로 받거나 함수를 반환하는 함수를 고차 함수라고 한다. 아래 예제의
makeMultiplier와 위의map이 모두 여기에 해당한다.map에 전달된 함수는 콜백 함수이다.-
map: 함수를 인자로 받아 각 요소를 변환한 새 배열을 만든다. -
filter: 함수를 인자로 받아 조건을 만족하는 요소만 모은 새 배열을 만든다. -
reduce: 함수를 인자로 받아 요소를 순회하며 하나의 결과로 누적한다.const numbers = [1, 2, 3, 4]; numbers.map(n => n * 2); // [2, 4, 6, 8] numbers.filter(n => n % 2 === 0); // [2, 4] numbers.reduce((sum, n) => sum + n, 0); // 10 -
아래의
makeMultiplier는 함수를 반환하므로 고차 함수이다. 함수를 인자로 받는 조건과 반환하는 조건 중 하나만 만족해도 고차 함수라고 한다. -
‘일급 함수’는 함수를 값처럼 다룰 수 있다는 성질을, ‘고차 함수’는 함수를 받거나 반환하는 함수의 역할을 뜻한다.
-
-
반대로 함수가 함수를 결과로 돌려주는 것도 가능하다.
function makeMultiplier(x) { return function (n) { return n * x; }; // 함수를 결과로 리턴 } const double = makeMultiplier(2); double(5); // 10 -
반환된 함수도 값이므로
double처럼 변수에 담아 두었다가 필요할 때 호출할 수 있다.
‘일급’은 값을 저장, 전달, 반환할 수 있다는 성질이고, ‘객체’는 자바스크립트 함수가 어떤 종류의 값인지를 설명한다.
-
지금까지 JS 함수를 다루는 다양한 방법을 살펴보았다. 이것이 ‘일급’이라는 말의 의미이다.
-
그렇다면 ‘일급 객체’에서 객체라는 말은 왜 붙을까?
-
자바스크립트에서는 함수 자체가 호출 가능한 객체이기 때문이다.
-
숫자와 문자열도 일급 값으로 다룰 수 있지만, 그 자체는 객체가 아닌 원시값이다.
-
이와 다르게, 함수는 일반 객체처럼 프로퍼티를 가질 수 있다.
function greet() {} greet.count = 0; console.log(greet.name); // 'greet'- 다만 일반 객체와 달리 함수는 호출할 수 있다.