컴퓨터 공학의 근간을 이루는 여러 개념 중에 추상화(abstraction)가 있습니다. 추상화의 다른 말은 요약입니다. 복잡한 어떤 것을 압축해서 핵심만 추출한 상태로 만드는 것이 추상화입니다. 사실 이 세상은 추상화로 가득차 있습니다. 인간은 추상화를 매우 좋아하고 그렇게 사고하는 것이 효율적이고 편하기 때문입니다.
예를 들어, 브라우저 창에 주소를 입력했을 때 정확히 무슨 일이 일어나는 지 전부 알지 못합니다. 그런 복잡한 것들은 가려져 있고 우리는 그저 주소창에 올바른 주소를 입력하면 브라우저가 해당 사이트를 보여준다는 것만 알고 있습니다. 여러분들이 스마트폰으로 카카오톡이나 페이스북 메신저를 통해 친구에게 'ㅇㅇ'이란 메세지를 보내면 그 순간 여러분들의 스마트폰은 기지국과 약 20개의 메세지를 주고 받습니다. 하지만 우린 이런 것들은 알지 못합니다. 알 필요도 없습니다. 하지만 입력창에 메세지를 입력하고 전송 버튼을 누르기만 하면 내 친구가 메세지를 받는다는 사실을 알고 있습니다. 자동차의 시동 버튼, 엑셀도 추상화고 지하철/버스 카드도 추상화의 결과입니다. 추상화가 아닌 것을 찾아보기 힘들 정도입니다.
자바스크립트(를 비롯한 많은 프로그래밍 언어) 역시 추상화의 결과입니다. 컴퓨터를 구성하는 장치(CPU)는 0과 1만 이해합니다. 크롬 개발자 도구의 콘솔(console)탭에서 아래 코드를 입력했을 때, 어떤 과정을 거쳐 10이 출력되는지 몰라도 10을 출력할 수 있습니다. 그런 복잡한 것들은 크롬의 자바스크립트 해석기(엔진)가 대신 해주기 때문입니다.
function sum(num1, num2) {
return num1 + num2;
}
const output = sum(3, 7);
console.log(output); // --> 10
컴퓨터의 내부 구조에 대한 고민이 해결되었기 때문에, 자바스크립의 문법(syntax)을 올바르게 사용하는 것만으로 다양한 프로그램을 (자바스크립트가 없었을 때) 보다 쉽게 작성할 수 있습니다. 이처럼 고민거리가 줄어들고, 그래서 문제의 해결이 더 쉬워지는 것이 추상화의 이점입니다.
추상화 = 생산성(productivity)의 향상
한편 프로그램을 작성할 때 자주 반복되어 사용되는 로직은 별도의 함수로 작성하기도 합니다. 이 역시 추상화의 좋은 사례입니다. 추상화의 관점에서 함수를 바라보면, 함수는 사고(thought) 또는 논리(logic)의 묶음입니다.
아래의 getAverage
함수는 수(number
)를 요소로 갖는 배열을 입력받아 요소의 평균값을 리턴합니다. 앞으로는 수를 요소로 갖는 배열을 인자로 전달하기만 하면 (조금? 복잡한 로직은 신경쓰지 않아도) 언제나 평균값을 얻게 됩니다.
function getAverage(data) {
let sum = 0;
for (let i = 0; i < data.length; i++) {
sum = sum + data[i];
}
return sum / data.length;
}
let output = getAverage([1, 2, 3]);
console.log(output); // --> 2
output = getAverage([4, 2, 3, 6, 5, 4]);
console.log(output); // --> 4
함수를 통해 얻은 추상화의 단계를 한단계 더 높인 것이 고차 함수입니다. getAverage
함수는 값(배열)을 전달 받아, 이 값을 가지고 복잡한 작업을 수행합니다. 이는 값 수준에서의 추상화입니다.
함수 = 값을 전달 받아 값을 리턴한다 = 값에 대한 복잡한 로직은 감추어져 있다 = 값 수준에서의 추상화
고차 함수는 이 추상화의 수준을 사고의 추상화 수준으로 끌어 올립니다.
값 수준의 추상화: 단순히 값(value)을 전달 받아 처리하는 수준
사고의 추상화: 함수(사고의 묶음)를 전달 받아 처리하는 수준
즉, 고차 함수를 통해 보다 높은 수준(higher order)에서 생각할 수 있습니다.
고차함수 = 함수를 전달 받거나 함수를 리턴한다 = 사고(함수)에 대한 복잡한 로직은 감추어져 있다 = 사고 수준에서의 추상화
추상화의 수준이 높아진만큼 생산성도 비약적으로 상승합니다. 이를 예시를 통해 살펴 보겠습니다.