새소식

Study/JavaScript

일급 객체, 고차 함수 (1)

  • -

일급 객체 (first-class citizen)

- 대표적인 일급 객체 중 하나가 함수

- 자바스크립트(JavaScript)에서 함수는 아래와 같이 특별하게 취급한다.

  • 변수에 할당(assignment) 할 수 있다.
  • 다른 함수의 인(argument)로 전달될 수 있다.
  • 다른 함수의 결과로서 리턴(return)될 수 있다.

함수를 변수에 할당할 수 있기 때문에 함수를 배열의 요소나 객체의 속성값으로 저장할 수 있다.

> 함수를 데이터(string, number, boolean, array, object)를 다루듯이 다룰 수 있다.

 

 

1. 변수에 함수를 할당하는 경우 

/* 자바스크립트에서 함수는 일급 객체ㅔ이기 때문에 변수에 저장할 수 있다.
함수 표현식은 할당 전에 사용할 수 없다. */

const calculate = function(num){
  return num + num;
};

// calculate 에는 함수가 저장되어 있으므로 함수 호출 연산자 ()를 사용할 수 있다.
result = calculate(6);
console.log(result);  // 36

위의 함수 표현식(function expression)은 함수 선언식(function declaration)과 다르게 호이스팅이 적용되지 않는다.

https://developer.mozilla.org/en-US/docs/Glossary/Hoisting

 

Hoisting - MDN Web Docs Glossary: Definitions of Web-related terms | MDN

JavaScript Hoisting refers to the process whereby the interpreter appears to move the declaration of functions, variables or classes to the top of their scope, prior to execution of the code.

developer.mozilla.org

  • 호이스팅은 선언된 위치에 관계없이 어디서든 함수를 사용할 수 있게 한다.
  • 코드가 실행괴는 과정에서 함수 선언부를 코드의 최상단으로 끌어올리는 것처럼 보이게 한다.

함수 선언식의 호이스팅에 지나치게 의존한다면 코드의 유지 보수가 쉽지 않다.

> 코드 리뷰나 디버깅을 할 때, 위아래로 왔다 갔다 할 수도..

 

함수 선언식은 어느 위치에나 함수를 선언할 수 있고, 함수의 실행 위치도 중요하지 않다.

함수 표현식은 함수의 할당과 실행 위치에 따라 결과가 크게 달라지기 때문에 코드의 위치를 어느 정도 예측할 수 있다.

 

호이스팅을 제외하면 함수 선언식과 함수 표현식의 차이가 크게 없지만

함수 표현식의 경우 함수가 변수에 저장될 수 있다는 사실을 보다 분명하게 보여준다

 

* 함수는 변수에 저장된 데이터를 인자로 받거나, 리턴 값으로 사용할 수 있다.

* 함수도 변수에 저장될 수 있기 때문에 함수를 인자로 받거나 리턴 값으로 사용할 수 있다.


고차 함수(higher order function) HOF

- 함수를 인자(argument)로 받을 수 있고 함수 형태로 리턴할 수 있는 함수

- 함수 내부에서 변수에 함수를 할당할 수 있고 이 변수를 리턴할 수 있다.

> 여기서 변수에 할당하지 않고 바로 함수를 이용할 수 있다.

- 어떤 고차 함수에 함수를 인자로 전달하고, 고차 함수는 함수 자체를 리턴한다.

> 변수가 빠졌을 뿐, 동일하게 동작한다!

 

 

콜백 함수(callback function)

- 다른 함수(caller)의 인자(argument)로 전달되는 함수

- 어떤 작업이 완료되었을 때 호출하는 경우가 많아서 답신 전화를 뜻하는 콜백이라는 이름이 붙여졌다.

- 콜백 함수를 전달받은 고차 함수는 함수 내부에서 이 콜백 함수를 호출(invoke)할 수 있다.

* caller는 조건에 따라 콜백 함수의 실행 여부를 결정할 수 있다.

   > 호출을 안할 수도, 여러 번 실행할 수도, 특정 작업 완료 후 호출할 수도!

 

커리 함수

'함수를 리턴하는 함수'는 모양새가 특이한 만큼 부르는 용어가 따로 있다.

'함수를 리턴하는 함수'를 고안해 낸 논리학자 하스켈 커리(Haskell Curry)의 이름을 따 커리 함수라고 한다.

따로 커리 함수 용어를 사용하는 경우엔 고차 함수란 용어를 '함수를 인자로 받는 함수'에만 한정해 사용하기도 한다

* 그러나 정확하게 구분하면 고차 함수가 커리 함수를 포함한다.

 

 

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

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

function doubleNum(func, num) {
  return func(num);
}

let output = doubleNum(double, 6);
console.log(output); // 12

함수 doubleNum은 다른 함수를 인자로 받는 고차 함수

함수 doubleNum의 첫 번째 인자 func에 함수가 들어올 경우 함수 func는 함수 doubleNum의 콜백 함수

맨 아래 같은 경우 함수 double은 함수 doubleNum의 콜백 함수

 

 

2. 함수를 리턴하는 경우

함수 adder는 다른 함수를 리턴하는 고차 함수

adder는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴한다.

리턴되는 익명 함수는 인자 한 개를 받아서 added와 더한 값을 리턴한다.

adder(7)는 함수이므로 함수 호출 연산자 ()를 사용할 수 있다.

adder가 리턴하는 함수변수저장할 수 있다.

> JavaScript에서 함수는 일급 객체이기 때문에

 

 

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

이해를 돕기 위해 각 값이 어떻게 돌아가는지 console.log를 찍었다.

함수 doubleAdder는 고차 함수

함수 doubleAdder의 인자 func는 함수 doubleAdder의 콜백 함수

함수 double은 함수 doubleAdder의 콜백으로 전달됨.(콜백 함수)

doubleAdder(8, double)는 함수이므로 함수 호출 기호 () 사용 가능

doubleAdder가 리턴하는 함수를 변수에 저장할 수 있다.(일급 객체)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.