[JS] 일급 객체로서의 함수

jiny·2025년 10월 16일

기술 면접

목록 보기
65/78

🗣️ 일급 객체로서의 함수가 어떤 의미이며, 왜 중요한가요?

  • 의도: 지원자가 자바스크립트 함수가 일급 객체임을 이해하고, 이를 활용할 수 있는지 평가
    • 함수가 일급 객체로서 가질 수 있는 특성(변수에 할당, 다른 함수의 인수로 전달, 함수에서 반환)을 설명한다.
    • 일급 객체로서의 함수를 활용하는 예제를 떠올려본다.
  • 모범 답안

    자바스크립트에서 함수는 일급 객체로 취급됩니다.
    이는 함수가 일반 값처럼 변수에 할당되거나, 다른 함수의 인자로 전달되거나, 함수에서 반환될 수 있다는 뜻입니다.

    이런 특성 덕분에 자바스크립트는 고차 함수를 구현할 수 있고,
    map, filter, reduce 같은 함수형 프로그래밍 패턴을 사용할 수 있습니다.

    즉, 일급 객체로서의 함수는 코드를 더 유연하고 재사용 가능하게 만들어주는 핵심 개념입니다.


📝 개념 정리

🌟 일급 객체(First-Class Object)의 개념

프로그래밍 언어에서 특정 대상을 일반 값(value)처럼 다룰 수 있는 성질

  • 일급 객체가 되기 위한 조건
    1. 변수에 할당할 수 있다.
    2. 함수의 인자로 전달할 수 있다.
    3. 함수의 반환값으로 사용할 수 있다.

🌟 자바스크립트에서 함수는 왜 일급 객체인가?

자바스크립트에서는 함수가 단순한 실행 단위가 아니라, 객체(Object)처럼 동작하기 때문에 다음이 가능함

  1. 변수에 함수 할당
    const greet = function() {
      return "Hello!";
    };
  1. 함수의 인자로 전달
    function run(fn) {
      console.log(fn());
    }
    run(greet); // "Hello!"
  1. 함수의 반환값으로 사용
    function outer() {
      return function() {
        return "Inner function";
      };
    }
    const inner = outer();
    console.log(inner()); // "Inner function"

이런 특징 때문에 자바스크립트의 함수는 일급 객체라고 할 수 있음


🌟 일급 함수와 고차 함수

  • 일급 함수 (First-Class Function)
    • 일급 객체의 조건을 충족하는 함수
    • 함수가 값(value)과 완전히 동등하게 취급된다는 의미
  • 고차 함수 (Higher-Order Function)
    • 함수를 인자로 받거나 함수를 반환하는 함수
    • 인자로 함수를 받는 형태
      • setTimeout(fn, 1000), addEventListener('click', handler)
      • Array.prototype.map/filter/reduce/sort의 콜백
    • 함수를 반환하는 형태
      • 커링 함수, 팩토리 함수, 데코레이터
  • 표준 메서드에서의 고차 함수 동작 원리
    • map

      • 시그니처: map(callback: (value, index, array) => U): U[]

        부분의미
        callback:콜백 함수를 인자로 받음
        (value, index, array)콜백 함수의 매개변수 (각 요소 값, 인덱스, 원본 배열)
        => U콜백 함수가 리턴하는 값의 타입 (변환된 값의 타입)
        : U[]map() 전체가 반환하는 값은 U 타입의 요소를 가진 배열

        여기서 U가 의미하는 바가 뭘까?

        • U제네릭(Generic) 타입 변수
        • 즉, 결과값의 타입이 입력 배열과 달라도 된다는 뜻임
        • 예시
          const numbers = [1, 2, 3];
          const strings = numbers.map(n => n.toString());
          numbersnumber[] 타입
          stringsstring[] 타입
          ➡️ 즉, map()numberstring으로 타입이 바뀔 수도 있으므로, 리턴 타입을 미리 고정하지 않고 U라는 임의의 타입 변수로 표현함
      • 의미: 원본을 바꾸지 않고, 각 요소를 콜백으로 변환한 새 배열을 만듦

        const numbers = [1, 2, 3];
        const doubled = numbers.map(n => n * 2); // [2, 4, 6]
      • 핵심: 불변성 유지, 요소 수 보존

    • filter

      • 시그니처: filter(predicate: (value, index, array) => boolean): T[]

        부분의미
        predicate:이 함수가 true를 반환한 요소만 남김
        (value, index, array)콜백 함수의 매개변수 (각 요소 값, 인덱스, 원본 배열)
        => boolean콜백 함수가 리턴하는 값의 타입 (변환된 값의 타입)
        : T[]filter() 전체가 반환하는 값은 T 타입의 요소를 가진 배열
      • 의미: 콜백이 true를 반환한 요소만 남긴 부분집합 생성

        const evens = numbers.filter(n => n % 2 === 0); // [2]
    • reduce

      • 시그니처: reduce(reducer: (acc, cur, index, array) => A, initialAcc?: A): A

        부분의미
        reducer:누적된 값과 현재 값을 이용해 새로운 값을 만듦
        (acc, cur, index, array)콜백 함수의 매개변수 (누산기, 현재 요소 값, 인덱스, 원본 배열)
        => A콜백 함수가 리턴하는 값의 타입 (변환된 값의 타입)
        initialAcc누산기의 초기값 (없으면 첫 번째 요소가 기본값)
        : Areduce() 전체가 반환하는 값은 A 타입의 요소를 가진 하나의 결과값 (숫자, 객체, 배열 등)
      • 의미: 누산기 acc에 콜백 결과를 축적해서 단일 값(또는 객체/배열)을 만듦

        const sum = numbers.reduce((acc, cur) => acc + cur, 0); // 6
      • 핵심: initialAcc를 주면 빈 배열에서도 안전하고, 다양한 축약이 가능함(객체/맵/그룹화)


🌟 일급 객체 함수가 중요한 이유

이유설명
고차 함수 구현의 기반map, filter, reduce 같은 함수형 프로그래밍 핵심 함수가 가능
콜백 함수 기반 비동기 처리 가능setTimeout, addEventListener 등에서 함수 전달
클로저, 커링 등 고급 문법 구현 가능함수가 반환될 수 있으므로 내부 상태 유지 가능
코드 재사용성과 추상화 향상로직을 함수 단위로 분리해 재사용 용이

0개의 댓글