◈ 이 책에서 다루는 내용 ◈
◆ 실제 상황에서 활용할 수 있는 함수형 프로그래밍 기법
◆ 함수형 설계를 할 때 유용한 공통 구조와 숙어들
◆ 단순성, 모듈성, 버그 감소!
◈ 이 책의 대상 독자 ◈
코틀린 언어 자체와 코틀린 언어의 기능을 이미 충분히 이해한 사람을 대상으로 한다. 또한 객체지향 설계에 익숙하고 클래스, 인터페이스, 메서드, 변수를 잘 알아야 하지만, 함수형 프로그래밍에 대한 선수 지식이나 경험은 필요하지 않다.
일차적으로는 학문적인 책이지만 한편으로는 매우 실무적인 책이기도 하다. 전반에 걸쳐 여러 코드 예제를 살펴보고, 배우는 과정을 강화해주는 연습문제를 다수 제공한다. 그러므로 인텔리제이(IntelliJ) IDEA나 코틀린을 완전히 지원하는 비슷한 다른 IDE를 잘 이해하고 있어야 한다. IDE 대신 텍스트 편집기나 터미널을 사용하는 게 더 익숙하다면 그 또한 상관없다.
◈ 이 책의 구성 ◈
4개 부, 총 15개 장으로 이뤄져 있다. 1부에서는 함수형 프로그래밍을 소개하고 이 책 전반에 걸쳐 사용할 기본적인 빌딩 블록을 제공한다.
1장은 함수형 프로그래밍의 의미를 설명하고 함수형 프로그래밍의 이점에 대해 감을 잡도록 해준다.
2장은 재귀로 함수형 루프를 작성하는 방법이나 꼬리 호출 제거(tail-call elimination), 고차 함수(high-order function), 함수형 다형성(polymorphism) 같은 기본기를 알려준다.
3장은 리스트(list)와 트리(tree)라는 두 가지 컬렉션을 순수 함수형으로 정의하고 다루는 방법을 설명한다.
4장은 예외를 던지지 않고 효과적으로 오류를 처리하는 방법을 깊이 살펴본다.
5장은 효율적인 평가를 위한 비엄격성(non-strictness(지연성laziness이라고도 한다))에 대해 논의하고, 스트림 데이터 타입도 소개한다.
6장은 전이(transition)라고도 하는 상태 변이 동작(state mutation action)을 함수형 프로그램에서 다루는 방법을 알려주면서 1부를 마무리한다.
2부는 몇 가지 콤비네이터(combinator) 라이브러리를 설계하는 과정을 아주 느슨하게 설명하는 스타일로 돼 있다는 점에서 1부와 꽤 다르다.
7장은 비동기 병렬 처리(asynchronous parallel processing)를 위한 함수형 라이브러리를 설계하고 구축하는 방법을 보여준다.
8장은 난수화한 테스트를 위한 속성 기반 테스트(property-based test) 라이브러리를 설계하는 방법을 보여준다.
9장은 파싱(parsing) 영역으로 들어가서 JSON 파서 콤비네이터 라이브러리의 우아한 설계를 도출하는 방법을 보여준다.
3부에서는 타입 지정 함수형 프로그래밍에 속한 더 고급 주제인 타입 클래스(type class)를 살펴본다. 실제 상황에서 사용하는 몇 가지 설계 패턴 추상화를 다루고 여러분이 이런 추상화를 사용할 수 있도록 준비시킨다.
10장은 여러 값을 조합할 때 쓸 수 있는 추상화인 모노이드(monoid)를 다룬다.
11장은 악명 높은 모나드(monad)를 샅샅이 다루고 예제를 사용해 명확히 설명한다.
12장은 적용 가능 펑터(applicative functor)와 순회 가능 펑터(traversable functor)를 설명하면서 적용 가능(applicative)의 요건이 무엇인지 소개하고 모나드와 적용 가능의 차이를 보여준다.
마지막 4부에서는 앞서 배운 내용을 바탕으로 순수 함수형 코드에서 부수 효과를 다룬다.
13장은 임베디드된 명령형 DSL을 사용해 효과가 있는 코드의 표현을 단순화하는 방법을 보여주기 위해 I/O 모나드(프리 모나드)를 소개한다.
14장은 특정 부수 효과와 변이를 순수 함수 프로그램 안에 지역화하는(밖으로 노출시킬 수 없게 막으면서 내포시키는) 방법을 알려준다.
15장은 지금껏 배운 모든 내용을 집대성해, I/O 스트림을 점진적으로 처리할 수 있는 모듈화 가능하며 합성 가능한 프로그램을 위한 스트림 API를 개발한다.
◈ 지은이의 말 ◈
좋은 소프트웨어를 작성하는 것은 결코 쉽지 않은 일이다. 우리는 기계가 실행할 수 있는 쉽고 효율적으로 돌아가야만 하는 명령을 제공하고자 코드를 작성한다. 여기서 더 중요한 사실은 코드에는 다른 근본적인 목적이 있다는 점이다. 즉, 코드는 현재와 미래에 우리 코드와 상호작용할 사람들과 명확히 의사소통하기 위한 수단이라고 할 수 있다. 따라서 코드는 기계에 명령을 내리는 도구라는 역할을 초월해, 여러 사람이 협력해 기계에 명령을 내리기 위한 도구가 되고 있다.
나는 상대적으로 어릴 때부터 코딩을 해왔다. ZX 스펙트럼(ZX Spectrum)에서 베이직(BASIC) 코드를 작성을 시작으로, 이후 코모도어 64(Commodore 64)에서 기계어 코드를 작성했다. 오랫동안 이런저런 컴퓨터와 언어를 전전한 끝에 결국 열정적인 자바 개발자가 됐다. 그 시점까지 내가 배워왔던 프로그래밍 지식은 모두 프로시저 기반이었으며, 컴퓨터에게 할 일을 지시하는 명령어 단계를 나열한 것이었다. 2000년대 초 자바가 제시한 객체지향 개념은 나를 아주 놀라게 했다. 이제 컴퓨터 메모리상에서 객체를 통해 실제 세계의 개념을 모델링할 수 있게 됐기 때문이다! 또한 자바를 통해 컴파일 시점에 특정 규칙을 강제함으로써 실행 시점의 문제를 줄여주는 정적 타입 시스템의 가치도 배웠다.
시간이 지나면서 소프트웨어에 대해 생각하는 다른 방식을 발견했다. 이런 깨달음은 다른 정적 타입 언어인 스칼라로 프로그래밍을 시작하면서 내 안에 자리 잡기 시작했다. 함수형 프로그래밍은 완전히 새로운 패러다임으로, 내 마음은 클래스와 객체에 대해 생각하는 것에서 벗어나 클래스나 객체 안에 있는 함수와 메서드를 강조하는 것으로 이동했다. 운 좋게도 스칼라를 배울 때는 내게 몇 가지 환상적인 자료가 있었다. 첫 번째는 코세라(Coursera)에 있는 마틴 오더스키(Martin Odersky)의 훌륭한 ‘Functional Programming Principles in Scala(스칼라로 배우는 함수형 프로그래밍 원리)’라는 비디오 코스였다. 두 번째는 2014년에 출간된 『스칼라로 배우는 함수형 프로그래밍』(제이펍, 2015))였다. ‘빨간 책’으로 잘 알려진 이 책은 루나르 비아르드나손(Rúnar Bjarnason)과 폴 치우사노(Paul Chiusano)가 수년간 자신들의 경험과 노력을 쏟아부은 결과물이었다. 이 두 가지는 내 생각을 형성하는 데 크게 기여했으며, 오늘날 내가 프로그래밍을 인식하는 방식을 바꿔놨다.
코틀린을 배우기 시작했을 때는 코틀린이 스칼라와 비슷한 성능을 가졌음에도, 실용성을 특별히 강조하는 데 비해 타입 시스템을 사용하는 함수형 프로그래밍이라는 학문적 측면은 그다지 강조하지 않는다는 사실을 깨달았다. 몇몇 친구와 코세라에서 ‘Kotlin for Java Developers(자바 개발자를 위한 코틀린)’ 코스를 마친 다음, 우리는 그 스터디 그룹을 유지하면서 코틀린에서 타입을 사용하는 FP에 대해 탐구하는 토대로써 빨간 책의 내용을 사용하자고 이야기했다. 슬프게도 이 모임을 실제로 진행하지는 못했지만, 내 나름대로 연구를 더 진행해서 새로운 코틀린 FP 책의 개념을 매닝출판사에 제안했다. 초기 아이디어는 폴과 루나르의 책과 똑같은 내용을 다루되 모든 코드를 스칼라가 아닌 코틀린으로 변환하는 것이었다. 이 제안을 받아들여졌을 때 나는 매우 기뻤다. 하지만 일단 집필을 시작하자 책은 그 자체로 생명력이 있는 존재가 됐고, 기존의 제안에서 많은 것이(코드뿐 아니라 본문까지도) 달라졌다. 그럼에도 이 책은 원본인 빨간 책의 구조를 매우 충실히 따르고 있다.
코틀린 개발자를 위해 이 책을 쓰면서 나 자신도 엄청나게 성장할 수 있었다. 그 과정은 훌륭한 배움의 경험이기도 했으며, 이전보다 이 책의 개념을 더 심오하고 풍부하게 이해할 수 있게 됐다. 이 책을 통한 여행을 시작하는 여러분도 내가 각각의 페이지를 적을 때마다 느끼고 배웠던 내용을 최대한 많이 얻어가길 바란다. 소개하는 개념을 이해하면, 여러분이 코드를 작성하는 방식과 그 아이디어를 여러분의 발자국을 따라오는 다른 사람들에게 제시하는 방법을 영원히 바꿔줄 것이다. 이 책이 내게 효과가 있었듯이 여러분에게도 효과가 있길 바란다. 무엇보다 내가 그랬던 것처럼 여러분도 이 책의 모든 페이지에서 재미를 느끼고 즐기게 되길 기대한다.
◈ 옮긴이의 말 ◈
빅데이터 붐이 일 때 스칼라(Scala)와 스파크(Spark)가 적극적으로 커뮤니티에 받아들여지면서부터 함수형 프로그래밍에 대한 세간의 관심이 그 전에 비해 극적으로 늘어났다. 이제는 일반 개발자 사이에도 함수형 프로그래밍이 어느 정도 필수적인 프로그래밍 패러다임으로 받아들여지는 분위기다. 2010년대 이전과 비교하면, 함수형 프로그래밍에 대한 책도 많이 늘어났고 동영상 강의나 관련 자료도 인터넷에서 많이 찾아볼 수 있게 됐다.
그럼에도 함수형 프로그래밍을 정통적으로 알려주는 책은 그리 많지 않다. 무엇보다 일반 프로그래밍 언어에서 타입을 활용하는 함수형 프로그래밍의 고계 타입을 표현하려면 어려운 점이 많으므로, 함수형 패러다임과 복잡한 타입 시스템을 적극적으로 지원하는 하스켈(Haskell)이나 스칼라 같은 언어를 사용해 함수형 프로그래밍의 개념을 알려주는 경우가 많다. 대표적인 책으로 하스켈의 『가장 쉬운 하스켈 책』(비제이퍼블릭, 2014)이나 이른바 ‘빨간 책’인 스칼라의 『스칼라로 배우는 함수형 프로그래밍』이 있다.
반대로 정적 타입을 지원하지 않는 언어(자바스크립트 등)에서 함수형 프로그래밍을 다루는 책도 많이 있지만, 타입 시스템을 활용하지 않기 때문에 고계 타입이 주는 장점을 살리지 못한다는 한계가 있다.
이 책은 유명한 ‘빨간 책’의 코틀린 버전으로, 코틀린을 알고 있는 개발자들이 함수형 프로그래밍의 개념을 깊이 배우고 연습할 수 있도록 쓰였다. 새로운 패러다임을 배우기 위해 새로운 프로그래밍 언어를 배우면, 백지 상태에서 개념과 언어를 함께 배울 수 있어 완전히 새로운 관점에서 배움을 진행할 수 있다는 장점이 있다. 하지만 언어를 배우는 데 드는 노력으로 인해 개념을 이해하기는 더 어려워질 수도 있다. 그런 점에서 볼 때, 이 책은 코틀린 프로그래밍 언어를 사용했으므로 좀 더 쉽게 함수형 프로그래밍에 접근할 수 있는 길을 열어준다고 할 수 있을 것이다.
이 책을 읽고, 연습문제를 모두 풀어나가다 보면 함수형 프로그래밍의 개념을 이해하고 다양한 함수형 타입을 설계할 능력을 키워 나갈 수 있을 것이다. 또한, 명령형 코드를 작성할 때도 학습한 개념을 활용해 좀 더 우수하고 안전한 프로그램을 작성할 수 있게 된다. 부디 함수형 프로그래밍에 관심을 갖고 이 책을 집어든 여러분이 전체 여정을 마친 후 잘 훈련된 함수형 프로그래머로 거듭나길 기원한다.