일급 객체(first-class object)란 생성, 대입, 연산, 인자 또는 반환값으로서의 전달 등 프로그래밍 언어의 기본적 조작을 제한없이 사용할 수 있는 대상을 의미한다.
일급객체의 조건
Javascript의 함수는 위의 조건을 모두 만족하므로 Javascript의 함수는 일급객체이다.
따라서 Javascript의 함수는 흡사 변수와 같이 사용할 수 있으며 코드의 어디에서든지 정의할 수 있다.
즉, 함수를 리턴하는 함수', '함수를 인자로 받는 함수' 를 고차함수라고 할 수 있다.
오늘 고차함수라는 컨텐츠에 대해서 배우면서 가장 궁금했던 부분이다.
왜 쓸까...? 라고 생각했을 때 가장 먼저 든 생각은 '고차원적인 무엇인가를 구현해 내기 위해서는 연히 보다 복잡하면서 어려운 방법들이 사용되야 하니까...?'
이 생각이 전혀 틀린 말은 아니었으나 정확한 이유도 아니었다.
여러 이유가 있겠으나 그 중 가장 핵심적인 이유는 추.상.화!
'복잡한 어떤 것을 압축해서 핵심만 추출한 상태로 만드는 것'을 의미한다.
추상화의 예로 스마트폰으로 카카오톡이나 페이스북 메신저를 통해 친구에게 'ㅇㅇ'이란 메세지를 보내면, 그 순간 스마트폰은 기지국과 약 20개의 메세지를 주고받는다. 하지만 우리는 이런 것들을 전부 알지 못하고, 알 필요도 없다. 그러나 입력창에 메세지를 입력하고 전송 버튼을 누르면, 내 친구가 메세지를 받는다는 사실은 알고 있다.
즉, 이 메세지를 주고받게 만드는 복잡한 과정들은 모르지만 결과적으로 메세지를 주고 받을수 있다는 사실이 핵심이며 추상화의 결과이다.
일반적인 함수를 통해 얻은 추상화를 '값 수준에서의 추상화'라 한다.
고차 함수는 이 추상화의 수준을 사고의 추상화 수준으로 끌어올린다
즉, 추상화의 수준이 높아지는 만큼, 생산성도 비약적으로 상승하기 때문에 고차함수를 사용한다.
1. arr.forEach(callback( ele, index, array ) )
const numbers = [1, 2, 3];
let pows = [];
numbers.forEach(function (item) {
pows.push(item ** 2);
});
console.log(pows); // [ 1, 4, 9 ]
2. arr.filter ( callback ( ele, index, array ) )
const numbers = [1, 2, 3, 4, 5];
const result = numbers.filter(number => number > 3);
console.log(numbers); // [1, 2, 3, 4, 5];
console.log(result); // [4, 5]
3. arr.map ( callback ( ele, index, array ) )
const numbers = [1, 2, 3, 4];
const result = numbers.map((ele) => ele*2 )
console.log(numbers) // [1, 2, 3, 4]
console.log(result) // [2, 4, 6, 8]
4. arr.reduce ( callback ( accumulator, currentValue, currentIndex, array), initialValue)
const numbers = [1, 2, 3, 4];
let result1 = numbers.reduce((acc, cur) => acc+cur) // 초기값 설정 x
let result2 = numbers.reduce((acc, cur) => {return acc+cur}, 10 ) // 초기값 10
console.log(result1) // 10
console.log(result2) // 20
이렇게 숫자 계산에만 쓰이는 것이 아니다.
배열을 객체로 or 객체를 배열로 등등 여러곳에 응용하여 쓸 수 있다.
한가지 예시로 수업시간에 배운것을 보면
function makeAddressBook(addressBook, user) {
let firstLetter = user.name[0];
if(firstLetter in addressBook) {
addressBook[firstLetter].push(user);
} else {
addressBook[firstLetter] = [];
addressBook[firstLetter].push(user);
}
return addressBook;
}
let users = [
{ name: 'Tim', age: 40 },
{ name: 'Satya', age: 30 },
{ name: 'Sundar', age: 50 }
];
users.reduce(makeAddressBook, {});
/*
{
T: [
{ name: 'Tim', age: 40 }
],
S: [
{ name: 'Satya', age: 30 },
{ name: 'Sundar', age: 50 }
]
}
*/
콜백함수의 로직을 통해 주소록을 만들기도 한다.
처음엔 이게 진짜 뭔소린가 했다.... 오늘 이걸 이해 할 수 있던거 만으로도 정말 만족 ㅠㅠ
4가지 이외에도 더 있으나 4가지만 직접 다뤄보았기 때문에 이것만 포스팅 하도록 하자.
그리고 4개가 가장 powerful 하고 사용 빈도도 높다고 한다.
나머지는 나중에 쓸 일이 있으면 그때 포스팅 하도록 하겠다.
고차함수에 대해 몇번 보았으나 잘 이해가 가지않아서 힘들었었다.
근데 오늘 pair 수업에서 파트너가 개념에 대해 너무 잘 알고 있었고, 설명을 잘 해주셔서
이해하는데 큰 도움이 됫다. 정말 은인...
아직 배열의 고차함수 밖에 알지 못하지만 이것의 파워풀함은 느낄 수 있었다.
고차함수들을 섞어서 사용한다면 정말 효율적인 코드를 짤 수도 있겠다는 생각을 했다.
아직 완벽히 다룰줄 아는 건 아니니, 반복적인 복습으로 까먹지 않도록 해야겠다.