일급 객체 (First Class Object)
글 작성자: NoHack
728x90
First Class Object
자바스크립트를 공부하다 보면, 일급 객체(First Class Object)라는 용어를 종종 볼 수 있습니다. 어떤 의미에서 그냥 객체도 아니고, 일급 객체라고 부르는 것일까요? 자바스크립트에서는 다음 조건에 해당되는 객체를 모두 일급 객체라 합니다.
- 런타임 시점에 무명의 리터럴로 생성할 수 있다.
- 변수나 자료구조(배열/객체)에 할당할 수 있다.
- 함수의 매개변수로 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
자바스크립트에서 함수도 객체이기 때문에 묶어서 일급 객체라 부르겠습니다.
위 조건에 따라 코드로 구현하면 다음과 같습니다.
// 1. 런타임 시점에 무명의 리터럴로 생성할 수 있으며,
// 2. 변수나 자료구조(배열/객체)에 할당할 수 있다.
const sum = function (a, b) {
return a + b;
};
const sub = function (a, b) {
return a - b;
};
// 함수의 매개변수로 전달할 수 있다. (Callback)
function myForEach(list, callback) {
for (let i = 0; i < list.length; i++) {
callback(i, list[i], list);
}
}
myForEach([1, 2, 3, 4, 5], console.log);
// 함수의 반환값으로 사용할 수 있다. (Closure)
const userManager = (function () {
let userNum = 0;
return {
addUser() {
userNum++;
},
delUser() {
userNum--;
},
};
})();
userManager.addUser();
userManager.delUser();
자바스크립트의 일급 객체 특성을 잘 알아두면 함수형 프로그래밍을 구현할 때 다양하게 활용 가능합니다.
고차 함수
고차 함수(Higher-order Function)는 함수를 매개변수로 받거나, 반환값으로 사용하는 함수입니다. 대표적으로 배열 프로토타입의 메서드 중 forEach, map, filter, reduce가 해당됩니다. 게다가 자바스크립트에 미리 구현된 고차 함수들은 정말 중요한 문법인데, 그 이유는 부수 효과(Side effect)를 방지하는 불변성을 지향하는 함수형 프로그래밍에 기반을 두고 있기 때문입니다.
부수 효과란 함수 내부의 실행으로 인해 함수 외부 영역이 영향을 받는 것을 말합니다.
다음 코드를 보면서 부수 효과가 일어나지 않는 것을 확인하시면 좋을 것 같습니다.
const arr = [1, 2, 3, 4, 5];
// 1 2 3 4 5
arr.forEach((v) => {
console.log(v);
});
// [ 1, 4, 9, 16, 25 ]
let newArr = arr.map((v) => v ** 2);
console.log(newArr);
// [ 2, 4 ]
newArr = arr.filter((_, i) => i % 2);
console.log(newArr);
// 15
let sum = arr.reduce((pre, cur) => {
return pre + cur;
}, 0);
console.log(sum);
배열에 새로운 값을 추가하는 push 메서드나 제거하는 pop 메서드는 원본 배열을 건드리기 때문에 부수 효과가 발생하는 메서드입니다. 반면에 앞서 언급한 고차 함수들은 원본을 참고하여 새로운 복사본을 만들고, 이를 알맞게 변경한 후 반환합니다.
References
'🌈 기술스택 > JavaScript' 카테고리의 다른 글
자기 자신을 가리키는 값 this (0) | 2021.10.03 |
---|---|
자바스크립트 코드의 유효 범위 Scope (0) | 2021.10.03 |
얕은 복사 & 깊은 복사 (0) | 2021.10.03 |
유사 배열 객체 만들기 (0) | 2021.10.02 |
호이스팅 (Hoisting) (0) | 2021.10.01 |
댓글
이 글 공유하기
다른 글
-
자바스크립트 코드의 유효 범위 Scope
자바스크립트 코드의 유효 범위 Scope
2021.10.03 -
얕은 복사 & 깊은 복사
얕은 복사 & 깊은 복사
2021.10.03 -
유사 배열 객체 만들기
유사 배열 객체 만들기
2021.10.02 -
호이스팅 (Hoisting)
호이스팅 (Hoisting)
2021.10.01