자바스크립트에서 함수는 일급 객체로 취급됩니다.
이는 함수가 일반 값처럼 변수에 할당되거나, 다른 함수의 인자로 전달되거나, 함수에서 반환될 수 있다는 뜻입니다.이런 특성 덕분에 자바스크립트는 고차 함수를 구현할 수 있고,
map,filter,reduce같은 함수형 프로그래밍 패턴을 사용할 수 있습니다.즉, 일급 객체로서의 함수는 코드를 더 유연하고 재사용 가능하게 만들어주는 핵심 개념입니다.
프로그래밍 언어에서 특정 대상을 일반 값(value)처럼 다룰 수 있는 성질
자바스크립트에서는 함수가 단순한 실행 단위가 아니라, 객체(Object)처럼 동작하기 때문에 다음이 가능함
const greet = function() {
return "Hello!";
};function run(fn) {
console.log(fn());
}
run(greet); // "Hello!"function outer() {
return function() {
return "Inner function";
};
}
const inner = outer();
console.log(inner()); // "Inner 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());numbers는number[]타입
✅strings는string[]타입
➡️ 즉,map()은number→string으로 타입이 바뀔 수도 있으므로, 리턴 타입을 미리 고정하지 않고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 | 누산기의 초기값 (없으면 첫 번째 요소가 기본값) |
: A | reduce() 전체가 반환하는 값은 A 타입의 요소를 가진 하나의 결과값 (숫자, 객체, 배열 등) |
의미: 누산기 acc에 콜백 결과를 축적해서 단일 값(또는 객체/배열)을 만듦
const sum = numbers.reduce((acc, cur) => acc + cur, 0); // 6
핵심: initialAcc를 주면 빈 배열에서도 안전하고, 다양한 축약이 가능함(객체/맵/그룹화)
| 이유 | 설명 |
|---|---|
| 고차 함수 구현의 기반 | map, filter, reduce 같은 함수형 프로그래밍 핵심 함수가 가능 |
| 콜백 함수 기반 비동기 처리 가능 | setTimeout, addEventListener 등에서 함수 전달 |
| 클로저, 커링 등 고급 문법 구현 가능 | 함수가 반환될 수 있으므로 내부 상태 유지 가능 |
| 코드 재사용성과 추상화 향상 | 로직을 함수 단위로 분리해 재사용 용이 |