[SEB FE] Section 2
Unit1 - [JavaScript] 고차 함수
학습목표
- 일급 객체(first-class citizen)의 세 가지 특징을 설명할 수 있다.
- 고차 함수(higher-order function)에 대해 설명할 수 있다.
- 고차 함수를 자바스크립트로 작성할 수 있다.
개념학습
일급 객체
JS의 대표적인 일급 객체 중 하나가 함수이다. JS에서 함수는 아래와 같이 특별하게 취급된다.
- 변수에 할당(assignment) 할 수 있다.
- 다른 함수의 전달인자(argument)로 전달될 수 있다.
- 다른 함수의 결과로서 리턴될 수 있다.
함수를 변수에 할당할 수 있기 때문에, 함수를 배열의 요소나 객체의 속성값으로 지정할 수 있다. 함수를 데이터(string, number, boolean, array, object)처럼 다룰 수 있다.
const = square = function (num) {
return num * num;
};
output = square(7);
console.log(output);
- 또한 함수는 일급 객체의 특징을 가지기 때문에 아래처럼 객체 속성의 값으로 할당될 수 있다.
const cat = {
name: 'nabi',
age: 3,
cry: function(){
console.log('miaow...')
}
}
고차 함수의 이해
- 고차 함수(higher order function)는 함수를 전달인자(argument)로 받을 수 있고, 함수를 리턴할 수 있는 함수이다.
- '함수를 리턴하는 함수'와 '함수를 전달인자로 받는 함수' 모두, 고차 함수로 사용한다.
콜백 함수(callback function)
- 다른 함수(caller)의 전달인자(argument)로 전달되는 함수를 콜백 함수(callback function)라고 한다.
- 콜백 함수를 전달받은 고차 함수(caller)는, 함수 내부에서 이 콜백 함수를 호출(invoke)할 수 있고, 조건에 따라 콜백 함수의 실행 여부를 결정할 수도 있다.
다른 함수를 인자로 받는 경우
function double(num) {
return num * 2;
}
function doubleNum(func, num) {
return func(num);
}
let output = doubleNum(double, 4);
console.log(output);
함수를 리턴하는 경우
function adder(added) {
return function (num) {
return num + added;
}
}
let output = adder(5)(3);
console.log(output);
const add3 = adder(3);
output = add3(2);
console.log(output);
함수를 인자로 받고, 함수를 리턴하는 경우
function double(num) {
return num * 2;
}
function doubleAdder(added, func) {
const doubled = func(added);
return function (num) {
return num + doubled;
};
}
doubleAdder(5, double)(3);
const addTwice3 = doubleAdder(3, double);
addTwice3(2);
내장 고차 함수
학습 목표
- 배열 내장 고차 함수 filter에 대해서 이해할 수 있다.
- filter에 대한 이해를 기반으로, 나머지 내장 고차 함수를 학습할 수 있다.
- filter, map, reduce, forEach, find, sort, some, every
- 고차 함수를 쓰는 이유를 설명할 수 있다.
- 고차 함수를 활용하여 프로그램을 작성할 수 있다.
개념학습
내장 고차 함수
- JS에는 기본적으로 내장된 고차 함수가 여럿 있다. 그중에서 배열 메서드들 중 일부가 대표적인 고차 함수에해당한다.
내장 고차 함수 filter 이해하기
- 배열의 filter 메서드는, 모든 배열의 요소 중에서 특정 조건을 만족하는 요소를 걸러내는 메서드이다.
- filter 메서드가 고차함수인 이유는 filter 메서드의 전달인자로 함수를 전달했기 때문이다.
let arr = [1, 2, 3];
let result =
arr.filter(function(ele) {
return ele % 2 !== 0
});
let arr = [1, 2, 3, 4];
let output = arr.filter(짝수);
console.log(output);
arr = ['hello', 'code', 'states', 'happy', 'hacking'];
output = arr.filter(길이 5 이하)
console.log(output);
- 여기서 걸러내는 기준이 되는 특정 조건은 filter 메서드의 전달인자로 전달된다. 이때 전달되는 조건은 함수의 형태이다. filter 메서드는, 걸러내기 위한 조건을 명시한 함수를 전달인자로 받기 때문에 고차 함수이다.
filter 메서드가 동작하는 방식
let arr = [1, 2, 3];
arr.filter = function (arr, func) {
const newArr = [];
for (let i = 0; i < arr.length; i++) {
if (func(arr[i]) === true) {
newArr.push(this[i]);
}
}
return newArr;
};
- filter 메서드는 배열의 요소를 콜백 함수에 다시 전달한다. 콜백 함수는 전달받은 배열의 요소를 받아 함수를 실행하고, 콜백 함수 내부의 조건에 따라 참(true) 또는 거짓(false)을 리턴해야 한다.
filter 메서드 사용 예시
const isEven = function (num) {
return num % 2 === 0;
};
let arr = [1, 2, 3, 4];
let output = arr.filter(isEven);
console.log(output);
const isLteFive = function (str) {
return str.length <= 5;
};
arr = ['hello', 'code', 'states', 'happy', 'hacking'];
let output = arr.filter(isLteFive);
console.log(output);
내장 고차 함수 map 이해하기
- map은 배열의 모든 요소에게 동일한 행동을 준 값에 대하여 모두 반환한다.
- 행동은 함수로 작성하여 인자로 넣는다.
- 기존 배열을 수정하지 않는다.
let arr = [1, 2, 3];
let result =
arr.map(function(ele) {
return ele * 2
})
result;
내장 고차 함수 reduce 이해하기
- reduce는 배열을 하나의 값으로 만들어 준다.
- reduce는 초깃값을 정할 수 있다. 정하지 않는다면 배열의 제일 첫 번째 값이 초깃값이 된다.
- 초깃값은 누적된 값에 기반이 된다.
- 그 다음 값이 현재 값이 되는 데 이들은 우리가 정한 방식에 따라 결정된다.
- 배열 전부 계산이 된다.
- 초깃값을 정한다면 배열의 첫 번째 값이 현재값으로 지정된다.
reduce
는 다양한 형태로 사용된다.(연산, 비교, 다른 형태로 만들기 등등)
초깃값 X
let arr = [1, 2, 3];
let result = arr.reduce(
function(acc, cur, idx) {
acc + cur;
return acc;
});
result;
초깃값 O
let arr = [1, 2, 3];
let result = arr.reduce(
function(acc, cur, idx) {
acc + cur;
return acc;
}, 1);
result;
고차 함수의 중요성
학습목표
- 추상화에 대해 설명할 수 있다.
- 추상화의 관점에서 고차 함수가 갖는 이점에 대해 설명할 수 있다.
- 고차 함수를 통해 사고 수준에서 추상화를 달성할 수 있다.
개념학습
고차 함수와 추상화
- 추상화는 생산성을 향상시킨다.
- 고차 함수는 사고의 추상화 수준으로 끌어올린다.
- 값 수준의 추상화: 단순히 값(value)을 전달받아 처리하는 수준
- 사고의 추상화: 함수(사고의 묶음)를 전달받아 처리하는 수준
- 재사용이 가능하다.