더북(TheBook)

1.2.3 끝까지 추상화하기

지금까지 본 것처럼 부수 효과가 없는 순수 함수(pure function)를 합성하면 테스트하기 쉬운 더 안전한 프로그램을 작성할 수 있다. 순수 함수를 fun 키워드를 사용하거나 함수 값으로 정의할 수 있다. 앞의 예제에서 groupBy, map, reduce 메서드의 인자로 전달된 것이 바로 함수 값이다. 함수 값(function value)fun으로 정의한 함수와 달리 프로그램에서 조작 가능한 형태로 표현되는 함수를 말한다. 함수 값은 대부분 다른 함수에 인자로 넘겨지는 값이나 함수가 반환하는 값으로 쓰인다. 함수 값을 인자로 넘기거나 반환하는 방법은 나중에 자세히 배운다.

하지만 여기서 가장 중요한 개념은 추상화다. reduce 함수를 보라. reduce는 연산을 인자로 받고, 그 인자를 사용해 리스트를 단일 값으로 축약한다. 이때 피연산자로 같은 타입의 인자를 두 개 받아서 같은 타입의 값을 반환하는 연산이기만 하면 어떤 연산이든 reduce에 사용할 수 있다.

정수 리스트를 생각해 보자. 이 리스트의 모든 원소의 합계를 구하는 sum 함수를 작성할 수 있다. 그 후 모든 원소의 곱을 계산하는 product나 원소 중 최댓값, 최솟값을 구하는 max, min 등의 함수를 구현할 수도 있다. 그러나 reduce 함수로 이 모든 계산을 수행할 수도 있다. 이런 방식이 추상화다. 여러분은 모든 계산에 공통으로 들어 있는 부분을 reduce라는 함수에 졸여낸다. 그리고 필요에 따라 달라지는 부분(연산)을 인자로 reduce에 전달한다.

추상화를 더 진행할 수도 있다. 리스트의 모든 원소를 조합해 원소 타입과 다른 타입의 결괏값을 만들어내는 더 일반적인 함수로 추상화한다면 reduce 함수는 그 함수의 한 사례라고 할 수 있다. 예를 들어, 문자 리스트로 String을 만들 때 그 함수를 사용할 수 있다. 이런 식으로 함수를 사용하려면 최초 값(아마도 빈 문자열)이 있어야 한다. 3장과 5장에서 이와 같은 함수인 fold에 관해 배운다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.