1. 일급 객체(First-Class Citizen)
비행기의 퍼스트 클래스(First Class)를 떠올려 보자. 탑승수속, 라운지 이용, 기내식, 좌석 등 일반적인 이코노미 클래스와는 다른 서비스를 받는다. 컴퓨터 언어에서도 일급 객체(First-Class Citizen)라는 개념이 존재한다. 비행기의 퍼스트 클래스처럼, 아래와 같이 특별한 대우를 받는다.
- 변수에 할당(assignment)이 가능하다
- 다른 함수를 전달인자(argument)로 전달 받는다
- 다른 함수의 결과로서 리턴(return)이 가능하다.
앞서 여러 번 다뤘던 함수(function)는 위의 특징을 가지고 있으므로, JavaScript에서 일급 객체로 취급된다(C언어 등에서는 함수가 일급 객체가 아니기도 하다).
2. 고차 함수(Higher-Order Function)
JS에서 함수가 일급 객체로 취급되는 건 알았는데, 그래서 무엇이 중요할까? 바로 고차 함수(Higher-Order Function)가 가능하다는 점이다. 곧 배울 테지만 map, filter, reduce 등 기본적으로 내장된 고차 함수를 활용하면 빠르고 간편한 작업이 가능하다. 고차 함수는 아래와 같은 특징을 가진다.
- 다른 함수를 전달인자(argument)로 전달 받는다
- 다른 함수의 결과로서 리턴(return)이 가능하다.
다른 함수를 전달인자(argument)로 전달 받는다
다른 함수를 인자로 받을 때, 인자가 되는 함수를 콜백 함수(callback function)라고 한다. 어떤 작업이 완료되었을 때 호출하는 경우가 많아 답신 전화(callback)를 뜻하는 이름이 붙는 것.
콜백 함수(callback)를 전달받은 고차 함수(caller)는 함수 내부에서 콜백 함수를 호출할 수도, 조건에 따라 실행 여부를 결정할 수도, 여러 번 실행할 수도, 아예 실행하지 않을 수도 있다. 이와 관련된 내용은 추후 학습한다.
function double(num) {
return num * 2;
}
function doubleNum(func, num) {
// 함수 doubleNum의 첫번째 parameter에 함수가 인자로 들어온다면,
// 인자로 전달된 함수는 doubleNum의 콜백 함수가 된다
return func(num);
}
let result = doubleNum(double, 4);
// 함수 doubleNum의 첫번째 parameter에 함수 double이 인자로 전달되었다
// 함수 double은 함수 doubleNum의 콜백 함수가 된다
다른 함수의 결과로서 리턴(return)이 가능하다
클로저의 개념을 접하며 함수를 리턴하는 함수에 대해 배운 적이 있다. 이렇듯 고차함수의 가장 큰 특징은 함수를 다른 함수의 결과로 리턴하는 것이다. 우선 아래와 같이 인자를 두 개 전달받는 간단한 함수를 생각해 보자.
function addNum(num1, num2) {
return num1 + num2;
}
만약 num1에는 5나 3처럼 항상 같은 숫자를 전달하고, num2만 바꾸고 싶으면 어떻게 할까? 함수의 중첩을 통해 이를 해결할 수 있다.
function addNum(num1) {
return function(num2) {
return num1 + num2;
}
}
let add5 = addNum(5); // function(num2) {return 5 + num2;}
let add3 = addNum(3); // function(num2) {return 3 + num2;}
add5(2); // 7
add3(1); // 4
위와 같은 형태를 커링 함수(Currying Function)라고 한다. 1967년 Christopher Strachey가 Haskell Brooks Curry의 이름에서 착안한 것. 따로 커링 함수라는 용어를 사용하는 경우, 고차 함수라는 용어를 ‘함수의 전달인자로 받는 함수’에만 한정해 사용하기도 한다. 하지만 정확하게 구분하자면 고차 함수가 커링 함수를 포함하고 있다.
참고 사이트
'♻️ 개발자로 재활용 > 🟢 JavaScript' 카테고리의 다른 글
객체 지향 프로그래밍(OOP)과 4가지 특징 (0) | 2022.11.21 |
---|---|
클래스(Class)와 인스턴스(Instance) (0) | 2022.11.18 |
DOM : 문서 객체 모델의 기본 개념 (0) | 2022.11.13 |
Spread Syntax / Rest Parameter (0) | 2022.11.13 |
JavaScript Koans (1) : 연산자와 변수, 호이스팅 (0) | 2022.11.09 |