복잡한 어떤 것을 압축해서 핵심만 추출한 상태로 만드는 것
위 개념을 프로그래밍에 적용하면 복잡한 소프트웨어 시스템을 효율적으로 설계하고 구현할 수 있는 방법이다.
function getAvg(data) {
let sum = 0;
for (i = 0; i < data.length; i++) {
sum = sum + data[i]
}
return sum / data.length;
}
getAvg([1,2,3]); // 2
위 함수는 data라는 배열을 입력받아 내부에서 반복문을 통해 각 배열의 요소를 합하고, 마지막에 배열의 길이만큼 나누는 간단한 함수다.
함수를 작성하고 나서 어떤 배열 요소들의 평균값을 구하고 싶다면
getAvg([1,2,3])
의 형태로 사용하면 된다.
이렇게 함수를 사용할 때 함수 안에 있는 계산 방법 등은 가려져 있다. 값만 입력받을 뿐이다.
이 상황에서 이 함수는 '값 수준에서의 추상화'가 이루어졌다고 볼 수 있다.
filter, map, reduce 등 처럼 함수를 인자로 전달 받거나, 함수를 리턴하는 고차함수는 단순 값 수준에서가 아닌, 함수(사고의 묶음)의 수준에서 추상화가 이루어진 것이다.
이 얘기는 절차형 프로그래밍과 선언형프로그래밍으로 이어질 수 있다.
function double (arr) {
let results = [];
for (let i = 0; i < arr.length; i++){
results.push(arr[i] * 2)
}
return results
}
위 코드처럼 절차형 프로그래밍 방식은 배열 요소의 곱하기 2 한 값을 구하기 위해 반복문으로 배열 요소 하나하나에 접근, 계산하는 방법을 구현하고 있다.
function double (arr) {
return arr.map((item) => item * 2)
}
위 절차형 프로그래밍에서의 예시를 map 메소드로 표현한 것이다.
절차형의 for문, push와 같이 결과를 도출하기 위한 과정을 하나하나 적는게 아닌, 필요한 것이 어떤것인지 표현했다.
map()이 어떻게 작동되는지 알기보다는 '무엇을' 원하는지에 중점을 두는 방식이다.