본문 바로가기
Script/JavaScript

[JavaScript] Chapter 36. 고차 함수와 콜백(Callback) – 일급 객체란

by song.ift 2023. 2. 7.

함수는 일급 객체이다.

  • 자바스크립트에는 특별한 대우를 받는 일급 객체가 있다.
  • 대표적인 일급 객체 중 하나가 바로 함수이다.

 다음 조건을 만족하는 객체를 일급 객체라고 한다.

  1. 무명의 리터럴로 생성할 수 있다. (런타임 생성이 가능하다.)
    • 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당된다. 
  2. 변수나 자료구조(배열의 요소나 객체의 속성값)에 할당 할 수 있다.
  3. 다른 함수의 인자로 전달될 수 있다.
  4. 다른 함수의 결과로서 리턴될 수 있다.

자바스크립트 함수는 다음 위 조건을 모두 만족하므로 일급 객체이다.

 

 함수는 객체이다.

  • 함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미이다.
  • 함수는 객체이다.
  • 함수를 객체처럼 사용할 수 있다.
  • 변수, 배열 요소, 객체 값에 할당하거나 또 다른 함수의 인수로 전달되거나 함수에서 반환될 수도 있다.
  • 이는 함수형 프로그래밍을 가능하게 하는 자바스크립트의 장점 중 하나이다.
  • 함수 객체가 일반 객체와의 가장 큰 차이점은 함수는 호출할 수 있다는 것이다.
  • 그리고 함수 객체는 일반 객체에 없는 함수 고유의 프로퍼티를 소유한다.

함수는 객체의 인스턴스이다.

  • 함수는 실제로 객체의 인스턴스이다.
  • 함수를 정의할 때 실제로는 객체를 만드는 것이다.
  • 함수는 Object.prototype 객체의 프로퍼티를 상속받는다.
function helloWorld() {
  console.log('Hello World!');
}

console.log(typeof helloWorld); // --> function
console.log(helloWorld instanceof Object); // --> true
  • 자바스크립트 함수는 함수 객체라고 하는 특수한 유형의 객체이다.
  • 함수 객체는 실제 코드를 담고 있는 문자열을 포함한다.
  • 코드는 말 그대로 문자열이다.
const body = 'return Math.PI * radius * radius';
const circle = new Function('radius', body);
console.log(circle(5)); // --> 78.5398..

 


 

고차 함수란?

  • 고차 함수(higher order function)는 함수를 인자(argument)로 받을 수 있고, 함수의 형태로 리턴할 수 있는 함수이다.

콜백 함수란?

  • 다른 함수(caller)의 인자(argument)로 전달되는 함수를 콜백 함수(callback function)라고 한다.
  • 콜백 함수의 이름은, 어떤 작업이 완료되었을 때 호출하는 경우가 많아서, 답신 전화를 뜻하는 콜백이라는 이름이 붙여졌다.
  • 콜백 함수를 전달받은 고차 함수는, 함수 내부에서 이 콜백 함수를 호출(invoke) 할 수 있다.
  • 부르는 함수(caller)는 조건에 따라 콜백 함수의 실행 여부를 결정할 수 있다.
  • 아예 호출하지 않을 수도 있고, 여러 번 실행할 수도 있고, 특정 작업의 완료 후에 호출하는 경우도 있다.

커리 함수란?

  • ‘함수를 리턴하는 함수’는 모양새가 특이한 만큼, 부르는 용어가 따로 있다.
  • ‘함수를 리턴하는 함수’를 고안해 낸 논리학자 하스켈 커리(Haskell Curry)의 이름을 따, 커리 함수라고 한다.
  • 따로 커리 함수라는 용어를 사용하는 경우에는, 고차 함수란 용어를 ‘함수를 인자로 받는 함수’에만 한정해 사용하기도 한다.
  • 그러나 정확하게 구분하자면, 고차 함수가 커리 함수를 포함한다.

 

고차 함수 예시

1. 다른 함수를 인자로 받는 경우

 
function double(num) {
  return num * 2;
}

// doubleNum 함수는 고차 함수이다. (다른 함수를 인자로 받음)
// doubleNum 함수의 인자 func에 함수가 들어올 경우
// func은 doubleNum의 콜백 함수이다.
function doubleNum(func, num) {
  return func(num);
}

// 아래의 경우 double은 doubleNum의 콜백 함수이다.
doubleNum(double, 5);

2. 함수를 리턴하는 경우

 
// subtractor 함수는 고차 함수이다. (다른 함수를 리턴한다.)
function subtractor(subtract) {
  return function (num) {
    return num - subtract;
  }
}

// subtractor(5)는 함수이므로 호출 연산자 '()'를 사용 할 수 있다.
subtractor(5)(8) // --> 3

// subtractor 함수가 리턴하는 함수를 변수에 저장할 수 있다.
// 이는 자바스크립트에서 함수는 일급 객체이기 때문이다.
const subtract5 = subtractor(5);
subtract5(8) // -> 3

3. 함수를 인자로 받고, 함수를 리턴하는 경우

 
function double(num) {
  return num * 2;
}

// doubleSubtractor 함수는 고차 함수이다.
function doubleSubtractor(subtract, func) {
  const doubled = func(subtract);
  return function (num) {
    return num - doubled;
  }
}

// double 함수는 doubleSubtractor 함수의 콜백으로 전달되었다.
doubleSubtractor(5, double)(18); // --> 8

 


 

배열의 내장 고차 함수

  • 자바스크립트가 기본적으로 제공해주는 기능이 달린 함수를 내장 함수라고 한다.
  • 예를 들어 배열에서 메소드가 있다. 이것이 내장 함수이다.
  • 배열에 메소드를 직접 추가할 수도 있다.
  • 이러한 배열 메소드 중에 함수를 인자로 받고 함수를 값으로 변환할 수 있는 함수를 내장 고차함수하고 한다.
  • 자바스크립트에는 기본적으로 내장된 고차 함수가 여러 개 있다.
  • 배열 고차 함수 메서드 : forEach, find, filter, map, reduce, sort, some, every

댓글