[JS] 일급 객체
아래 내용은 얄코님의 강좌를 들은 뒤 개인적으로 정리한 내용입니다. 만약 자세한 내용을 전문적으로 학습하고 싶으면 아래 링크를 참조해주세요
제대로 파는 자바스크립트 - JavaScript 끝.장.내.기
일급객체
일급 객체 ( first-class object ) 란 다른 객체들에 일반적으로 적용가능한 연산을 모두 지원하는 객체를 가리킨다.
일급객체의 특성
- 상수 또는 변수에 할당될 수 있다.
- 다른 함수에 인자로 전달될 수 있다.
- 다른 함수의 결과값으로서 반환될 수 있다.
할당
function isOddNum (number) {
return number % 2 ? true : false;
};
const checkIfOdd = isOddNum;
함수도 객체의 한 종류이다. 위의 코드에서는 변수에 함수를 할당하고 있다. 즉, 함수는 일급객체의 첫번째 특성을 만족한다.
객체와 배열의 값으로도 할당을 할 수 있다.
let person = {
name: 'mobuk',
age: 21,
introduce: function (formal) {
return formal
? '안녕하십니까. mobuk입니다.'
: '안녕~ 나는 mobuk이야.';
}
};
객체에 함수 property 를 포함하는 방법 ⇒ this
let person = {
name: 'mobuk',
age: 21,
introduce: function (formal) {
return `저는 ${this.name} 입니다. ${this.age}살입니다. `;
}
여기서 this는 객체 자신을 의미한다. (즉, person) 그래서 객체의 다른 property에 접근할 때에는 this를 사용하면 된다. 이때, 화살표 함수로 정의하면 본인 객체를 인식하지 못하니 주의한다.
인자로 전달
함수가 다른 함수의 인자로 전달받을 수 있다.
- 전달받는 함수 : 고차함수
- 전달되는 함수 : 콜백함수
let list = [1, 2, 3, 4, 5];
function doInArray (array, func) {
for (item of array) {
func(item);
}
}
doInArray(list, console.log);
doInArray의 인자로 함수가 전달되는 모습을 볼 수 있다. 이때, doInArray를 고차함수, console.log를 콜백함수라고 한다.
function doNTimes (func, repeat, x, y) {
let result = x;
for (i = 0; i < repeat; i++) {
result = func(result, y);
}
return result;
}
console.log(
doNTimes((x, y) => x * y, 3, 5, 2),
doNTimes((x, y) => x / y, 3, 5, 2)
};
(x, y) => x * y 처럼 함수의 이름이 없는 형태를 익명 함수 (anonymous function)라고 한다.
이런 형태는 함수형 프로그래밍에 유용하게 사용된다.
결과값으로 변환
함수 자체를 반환값으로 줄 수 있다. 이때, 반환하는 함수의 이름이 꼭 필요한 것은 아니기에 익명함수 형태로 작성할 수 있다.
const add = (a, b) => a + b;
const sub = (a, b) => a - b;
const mul = (a, b) => a * b;
const div = (a, b) => a / b;
function comb3ArmFuncs(armFunc1, armFunc2, armFunc3) {
return (x, y) => armFunc3(armFunc2(armFunc1(x, y), y), y);
}
const add_mul_sub = comb3ArmFuncs(add, mul, sub);
const mul_add_div = comb3ArmFuncs(mul, add, div);
const div_add_mul = comb3ArmFuncs(div, add, mul);
console.log(
add_mul_sub(10, 4),
mul_add_div(10, 4),
div_add_mul(10, 4)
);
+) currying : 필요한 인자보다 적은 수의 인자를 받았을 때 나머지 인자를 인자로 받는 다른 함수를 반환한다.
function curryAddMultSubt (a) {
return function (b) {
return function (c) {
return function (d) {
return (a + b) * c - d;
}
}
}
}
const curryAddMultSubt2 = a => b => c => d => (a + b) * c - d;