자바스크립트 일급 객체(First-class Function)란?

자바스크립트에서 함수를 설명할 때 ‘일급 객체’라는 용어를 사용한다. 이는 변수에 저장하거나 다른 함수의 인자로 전달하고, 함수의 반환값으로도 사용할 수 있는 객체를 뜻한다. 자바스크립트의 함수는 이처럼 다른 값과 같은 방식으로 다룰 수 있고(일급), 그 자체로 객체이기도 하므로 일급 객체에 해당한다.

JavaScript

개념

  1. 프로그래밍 언어에서 값은 저마다 다룰 수 있는 방식이 정해져 있다.
  2. 어떤 값은 변수에 담거나, 함수에 넘기거나, 함수의 결과로 돌려받을 수 있다.
    • 숫자와 함수를 같은 방식으로 저장·전달·반환하는 예시이다.

      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를 먼저 실행한 결과인 문자열을 전달한다.

  3. 이처럼 값을 변수에 저장하고 인자로 전달하거나 반환값으로 사용할 수 있는 성질을 일급(first-class)이라고 한다.
  4. 자바스크립트(JS)에서는 숫자, 문자열, 객체뿐 아니라 함수도 이 조건을 만족한다. 즉, 일급이다.
  5. 그래서 JS 함수를 일급 객체, 또는 일급 함수라고 표현한다.

일급 함수가 되기 위한 네 가지 조건

  1. 일급 함수 특징을 네 가지로 정리하면 다음과 같다.
    • 첫째, 런타임에 생성할 수 있어야 한다.
    • 둘째, 변수나 자료구조(객체, 배열)에 저장할 수 있어야 한다.
    • 셋째, 함수의 매개변수로 전달할 수 있어야 한다.
    • 넷째, 함수의 반환값으로 사용할 수 있어야 한다.
  2. 네 조건은 '함수를 다른 값과 같은 방식으로 다룰 수 있는가'라는 하나의 질문으로 모인다고 볼 수 있다.

조건별 예시

  1. 먼저 함수는 런타임에 함수 표현식으로 만들어 변수에 담을 수 있다.

    const add = function (a, b) { return a + b; };
  2. JS 함수는 변수뿐 아니라 객체나 배열 같은 자료구조에도 저장할 수 있다.

    // JS 함수
    const add = function (a, b) { return a + b; };
    
    const calculator = { add }; // 객체에 저장
    const ops = [add, (a, b) => a - b]; // 배열에 저장
  3. JS 함수는 다른 함수의 인자로 전달할 수도 있다.

    [1, 2, 3].map(function (n) { return n * 2; }); // [2, 4, 6]
  4. 함수를 인자로 받거나 함수를 반환하는 함수를 고차 함수라고 한다. 아래 예제의 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는 함수를 반환하므로 고차 함수이다. 함수를 인자로 받는 조건과 반환하는 조건 중 하나만 만족해도 고차 함수라고 한다.

    • ‘일급 함수’는 함수를 값처럼 다룰 수 있다는 성질을, ‘고차 함수’는 함수를 받거나 반환하는 함수의 역할을 뜻한다.

  5. 반대로 함수가 함수를 결과로 돌려주는 것도 가능하다.

    function makeMultiplier(x) {
      return function (n) { return n * x; }; // 함수를 결과로 리턴
    }
    
    const double = makeMultiplier(2);
    double(5); // 10
  6. 반환된 함수도 값이므로 double처럼 변수에 담아 두었다가 필요할 때 호출할 수 있다.

‘일급’은 값을 저장, 전달, 반환할 수 있다는 성질이고, ‘객체’는 자바스크립트 함수가 어떤 종류의 값인지를 설명한다.

  1. 지금까지 JS 함수를 다루는 다양한 방법을 살펴보았다. 이것이 ‘일급’이라는 말의 의미이다.

  2. 그렇다면 ‘일급 객체’에서 객체라는 말은 왜 붙을까?

  3. 자바스크립트에서는 함수 자체가 호출 가능한 객체이기 때문이다.

  4. 숫자와 문자열도 일급 값으로 다룰 수 있지만, 그 자체는 객체가 아닌 원시값이다.

  5. 이와 다르게, 함수는 일반 객체처럼 프로퍼티를 가질 수 있다.

    function greet() {}
    greet.count = 0;
    console.log(greet.name); // 'greet'
    • 다만 일반 객체와 달리 함수는 호출할 수 있다.

참고 자료

  1. MDN: First-class function

댓글