마르코버뮬런,루나르비아르드나손,폴치우사노
저자:마르코버뮬런(MarcoVermeulen)
20여년이상의JVM프로그래밍경력이있는프로그래머이다.
저자:루나르비아르드나손(RunarBjarnason)
폴치우사노(PaulChiusano)와함께『스칼라로배우는함수형프로그래밍』(제이펍,2015)을저술했다.
저자:폴치우사노(PaulChiusano)
루나르비아르드나손(RunarBjarnason)과함께『스칼라로배우는함수형프로그래밍』(제이펍,2015)을저술했다.
역자:오현석
모빌리티42이사로일하면서매일고객의요청에따라코드를만드는현업개발자다.어릴때처음컴퓨터를접하고매혹된후경기과학고,KAIST전산학과(프로그래밍언어전공석사)를거치면서계속컴퓨터를사용해왔다.직장에서는주로코틀린이나자바를사용한서버프로그래밍을하고,주말이나여가시간에는번역을하거나공부를하면서즐거움을찾는다.시간이아주많이남을때는시뮬레이션게임을즐기면서머리를식히고,어떻게하면막내자식을프로그래밍의세계로끌어들일수있을지를고민하는아빠이기도하다.『코어파이썬애플리케이션프로그래밍』(에이콘,2014)을시작으로『KotlininAction』(에이콘,2017),『아토믹코틀린』(길벗,2023),『코딩좀아는사람』(윌북,2023)등30여권의책을번역했다.
역자:서형국
KAIST,서강대학교정보통신대학원을거쳐과거에는텍스트마이닝,현재는언어AI의다양한프로젝트에참여했다.현재는LGCNSD&A연구소에서MLOps,생성형AI관련클라우드AI서비스개발업무를수행하고있다.그간의경험으로사소하지만도움이되는엔지니어가됐으면하는교회집사이자고양이집사이다.
1부.함수형프로그래밍소개
1장.함수형프로그래밍이란?
1.1FP의장점:간단한예제
1.1.1부수효과가있는프로그램
1.1.2함수형해법:부수효과제거하기
1.2정확히(순수)함수란무엇인가?
1.3참조투명성,순수성,치환모델
1.4앞으로살펴볼내용
요약
2장.코틀린으로함수형프로그래밍시작하기
2.1고차함수:함수를함수에넘기기
2.1.1잠시돌아가기:루프를함수적으로작성하는방법
2.1.2첫번째고차함수작성하기
2.2다형적함수:타입에대해추상화하기
2.2.1다형적함수예제
2.2.2익명함수를사용해고차함수호출하기
2.3타입에맞춰구현하기
요약
3장.함수형데이터구조
3.1함수형데이터구조정의하기
3.2함수적데이터구조다루기
3.2.1타입으로매칭하기위한'when'
3.2.2if-else를대신하는when
3.2.3패턴매칭은무엇이며코틀린매칭과어떤차이가있나?
3.3함수형데이터구조안의데이터공유
3.3.1데이터공유의효율
3.4리스트에대한재귀와이를고차함수로일반화하는방법
3.4.1리스트에작용하는다른함수들
3.4.2코틀린표준라이브러리의리스트
3.4.3단순한요소들로부터리스트함수를합성하는데따른비효율
3.5트리
요약
4장.예외를사용하지않고오류다루기
4.1예외를던지는것의문제점
4.2예외에대한문제가있는대안
4.2.1센티넬값
4.2.2디폴트값제공
4.3Option으로성공상황인코딩하기
4.3.1Option사용패턴
4.3.2Option합성,끌어올리기및예외기반API감싸기
4.3.3Option과for컴프리헨션사용하기
4.4성공과실패조건을Either로인코딩하기
4.4.1Either를for컴프리헨션에서사용하기
요약
5장.엄격성과지연성
5.1엄격한함수와엄격하지않은함수
5.2확장예제:지연리스트
5.2.1스트림을메모화하고재계산피하기
5.2.2스트림관찰을위한도우미함수
5.3프로그램기술과평가분리하기
5.4공재귀함수를통해무한한데이터스트림생성하기
5.5결론
요약
6장.순수함수형상태
6.1부수효과를사용해난수생성하기
6.2순수함수형난수생성기
6.3상태가있는API를순수함수형API로만들기
6.4상태동작을전달하는암시적접근방법
6.4.1상태동작조합을통해더큰능력발휘하기
6.4.2상태동작을내포시켜서재귀적으로재시도하기
6.4.3콤비네이터API를초기예제에적용하기
6.5일반적인상태동작타입
6.6순수함수형명령형프로그래밍
6.7결론
요약
2부.함수형설계와콤비네이터라이브러리
7장.순수함수형병렬성
7.1데이터타입과함수선택하기
7.1.1병렬계산을위한데이터타입
7.1.2동시성을보장하기위해병렬계산조합하기
7.1.3실행할계산을명시적으로표시하기
7.2표현선택하기
7.3최종사용자를염두에두고API다듬기
7.4대수적등식을사용해API에대해추론하기
7.4.1매핑규칙
7.4.2논리스레드분기의법칙
7.4.3논블로킹구현을위해액터사용하기
7.5가장일반적인형태로콤비네이터다듬기
요약
8장.속성기반테스트
8.1속성기반테스트맛보기
8.2데이터타입과함수선택하기
8.2.1가능한API에대한짧은초기예제코드모으기
8.2.2속성의의미와API탐구하기
8.2.3생성기의API와의미발견하기
8.2.4생성된값에의존하는생성기
8.2.5속성데이터타입다듬기
8.3테스트케이스최소화
8.4라이브러리를사용하고사용자경험개선하기
8.4.1몇가지간단한예제
8.4.2병렬계산에어울리는테스트스위트작성하기
8.5고차함수나다른가능성생성하기
8.6생성기의법칙
8.7결론
요약
9장.파서콤비네이터
9.1대수설계하기
9.1.1문자하나를인식하기위한파서
9.1.2전체문자열을인식하기위한파서
9.1.3반복을인식하기위한파서
9.2대수를설계하는한가지접근방법
9.2.1문자반복횟수세기
9.2.2슬라이싱과비어있지않은반복
9.3문맥에대한민감성처리하기
9.4JSON파서작성하기
9.4.1JSON파서의예상동작정의하기
9.4.2JSON형식정리
9.4.3JSON파서
9.5보고를통해오류를표면에드러내기
9.5.1오류보고첫번째시도
9.5.2오류내포를통해오류누적시키기
9.5.3분기와백트래킹제어
9.6대수구현하기
9.6.1점진적으로대수의구현구축하기
9.6.2파서의시퀀스처리하기
9.6.3파서에레이블을붙여서오류메시지잡아내기
9.6.4오류회복과백트래킹
9.6.5문맥민감파서를통해상태전파하기
9.7결론
요약
3부.함수형설계의일반패턴
10장.모노이드
10.1모노이드란무엇인가?
10.2모노이드로리스트접기
10.3결합성과병렬성
10.4예제:병렬파싱
10.5접을수있는데이터구조
10.6모노이드합성하기
10.6.1더복잡한모노이드조립하기
10.6.2순회융합을위해합성한모노이드사용하기
요약
11장.모나드와펑터
11.1펑터
11.1.1map함수를일반화해펑터정의하기
11.1.2법칙의중요성과펑터에대한관계
11.2모나드:flatMap과unit함수일반화하기
11.2.1모나드인터페이스소개
11.3모나드적인콤비네이터
11.4모나드법칙
11.4.1결합법칙
11.4.2구체적인모나드에대해결합법칙증명하기
11.4.3왼쪽과오른쪽항등법칙
11.5도대체모나드란무엇인가?
11.5.1항등모나드
11.5.2State모나드와부분적인타입적용
요약
12장.적용가능펑터와순회가능펑터
12.1재사용성을위해모나드일반화하기
12.2모나드의대안인적용가능펑터
12.3모나드와적용가능펑터의차이
12.3.1Option적용가능펑터와Option모나드의비교
12.3.2Parser적용가능펑터와Parser모나드
12.4적용가능펑터의장점
12.4.1모든적용가능펑터가모나드는아니다
12.5적용가능법칙을사용해프로그램에대해추론하기
12.5.1왼쪽과오른쪽항등원법칙
12.5.2결합법칙
12.5.3자연성의법칙
12.6순회가능을사용해traverse와sequence추상화하기
12.7Traversable을사용해고류타입을반복적으로변환하기
12.7.1모노이드에서적용가능펑터로
12.7.2상태동작을전파시키는동시에컬렉션순회하기
12.7.3순회가능구조조합하기
12.7.4단일패스효율성을위한트리융합
12.7.5내포된순회가능구조를동시순회하기
12.7.6모나드합성의함정과함정을피하는방법
요약
4부.효과와입출력
13장.외부효과와I/O
13.1효과가있는프로그램에서효과뽑아내기
13.2효과가있는코드를분리하기위해IO타입도입하기
13.2.1입력효과처리하기
13.2.2간단한IO타입의장단점
13.3실체화와트램폴린화를통해스택오버플로오류방지하기
13.3.1데이터생성자로흐름제어실체화하기
13.3.2트램폴린화:스택오버플로에대한일반적인해법
13.4더적절한뉘앙스의IO타입
13.4.1타당한가격이붙은모나드
13.4.2콘솔I/O만지원하는모나드
13.4.3순수해석기를사용해콘솔I/O테스트하기
13.5논블로킹과비동기I/O
13.6범용IO타입
13.6.1세계의반대쪽에있는주프로그램
13.7왜IO타입이스트리밍I/O에대해부족한가?
요약
14장.지역효과와가변상태
14.1순수함수형코드안에서상태변이가합법적이다
14.2부수효과의영역을강제하는데이터타입
14.2.1영역이제한된변이를위한DSL
14.2.2가변참조의대수
14.2.3가변상태동작실행하기
14.2.4ST모나드의데이터타입으로표현된가변배열
14.2.5순수함수적인인플레이스퀵소트
14.3순수성은맥락에따라달라진다
14.3.1예제를통한정의
14.3.2부수효과로취급할수있는것은무엇일까?
요약
15장.스트림처리와점진적I/O
15.1명령형I/O의문제점:예제
15.2간단한트랜스듀서를사용해스트림변환하기
15.2.1스트림트랜스듀서를만들기위한콤비네이터
15.2.2이어붙이기와합성을사용해여러트랜스듀서합치기
15.2.3파일처리를위한스트림트랜스듀서
15.3프로토콜파라미터화를위한확장가능한프로세스
15.3.1스트림발생을위한소스
15.3.2스트림트랜스듀서의자원안전성보장하기
15.3.3트랜스듀서를단일입력스트림에적용하기
15.3.4다중입력스트림
15.3.5출력처리를위한싱크
15.3.6효과가있는채널에서효과숨기기
15.3.7동적인자원할당
15.4실제세계에서의스트림트랜스듀서활용
요약
마무리하며
부록A연습문제힌트와팁
부록B연습문제해답
부록C고류타입
부록D타입클래스
이책에서다루는내용
-실제상황에서활용할수있는함수형프로그래밍기법
-함수형설계를할때유용한공통구조와숙어들
-단순성,모듈성,버그감소!
이책의대상독자
코틀린언어자체와코틀린언어의기능을이미충분히이해한사람을대상으로한다.또한객체지향설계에익숙하고클래스,인터페이스,메서드,변수를잘알아야하지만,함수형프로그래밍에대한선수지식이나경험은필요하지않다.
일차적으로는학문적인책이지만한편으로는매우실무적인책이기도하다.전반에걸쳐여러코드예제를살펴보고,배우는과정을강화해주는연습문제를다수제공한다.그러므로인텔리제이(IntelliJ)IDEA나코틀린을완전히지원하는비슷한다른IDE를잘이해하고있어야한다.IDE대신텍스트편집기나터미널을사용하는게더익숙하다면그또한상관없다.
이책의구성
4개부,총15개장으로이뤄져있다.1부에서는함수형프로그래밍을소개하고이책전반에걸쳐사용할기본적인빌딩블록을제공한다.1장은함수형프로그래밍의의미를설명하고함수형프로그래밍의이점에대해감을잡도록해준다.2장은재귀로함수형루프를작성하는방법이나꼬리호출제거(tail-callelimination),고차함수(high-orderfunction),함수형다형성(polymorphism)같은기본기를알려준다.3장은리스트(list)와트리(tree)라는두가지컬렉션을순수함수형으로정의하고다루는방법을설명한다.
4장은예외를던지지않고효과적으로오류를처리하는방법을깊이살펴본다.5장은효율적인평가를위한비엄격성(non-strictness(지연성laziness이라고도한다))에대해논의하고,스트림데이터타입도소개한다.6장은전이(transition)라고도하는상태변이동작(statemutationaction)을함수형프로그램에서다루는방법을알려주면서1부를마무리한다.
2부는몇가지콤비네이터(combinator)라이브러리를설계하는과정을아주느슨하게설명하는스타일로돼있다는점에서1부와꽤다르다.7장은비동기병렬처리(asynchronousparallelprocessing)를위한함수형라이브러리를설계하고구축하는방법을보여준다.8장은난수화한테스트를위한속성기반테스트(property-basedtest)라이브러리를설계하는방법을보여준다.9장은파싱(parsing)영역으로들어가서JSON파서콤비네이터라이브러리의우아한설계를도출하는방법을보여준다.
3부에서는타입지정함수형프로그래밍에속한더고급주제인타입클래스(typeclass)를살펴본다.실제상황에서사용하는몇가지설계패턴추상화를다루고여러분이이런추상화를사용할수있도록준비시킨다.10장은여러값을조합할때쓸수있는추상화인모노이드(monoid)를다룬다.11장은악명높은모나드(monad)를샅샅이다루고예제를사용해명확히설명한다.12장은적용가능펑터(applicativefunctor)와순회가능펑터(traversablefunctor)를설명하면서적용가능(applicative)의요건이무엇인지소개하고모나드와적용가능의차이를보여준다.
마지막4부에서는앞서배운내용을바탕으로순수함수형코드에서부수효과를다룬다.13장은임베디드된명령형DSL을사용해효과가있는코드의표현을단순화하는방법을보여주기위해I/O모나드(프리모나드)를소개한다.14장은특정부수효과와변이를순수함수프로그램안에지역화하는(밖으로노출시킬수없게막으면서내포시키는)방법을알려준다.15장은지금껏배운모든내용을집대성해,I/O스트림을점진적으로처리할수있는모듈화가능하며합성가능한프로그램을위한스트림API를개발한다.
지은이의말
좋은소프트웨어를작성하는것은결코쉽지않은일이다.우리는기계가실행할수있는쉽고효율적으로돌아가야만하는명령을제공하고자코드를작성한다.여기서더중요한사실은코드에는다른근본적인목적이있다는점이다.즉,코드는현재와미래에우리코드와상호작용할사람들과명확히의사소통하기위한수단이라고할수있다.따라서코드는기계에명령을내리는도구라는역할을초월해,여러사람이협력해기계에명령을내리기위한도구가되고있다.
나는상대적으로어릴때부터코딩을해왔다.ZX스펙트럼(ZXSpectrum)에서베이직(BASIC)코드를작성을시작으로,이후코모도어64(Commodore64)에서기계어코드를작성했다.오랫동안이런저런컴퓨터와언어를전전한끝에결국열정적인자바개발자가됐다.그시점까지내가배워왔던프로그래밍지식은모두프로시저기반이었으며,컴퓨터에게할일을지시하는명령어단계를나열한것이었다.2000년대초자바가제시한객체지향개념은나를아주놀라게했다.이제컴퓨터메모리상에서객체를통해실제세계의개념을모델링할수있게됐기때문이다!또한자바를통해컴파일시점에특정규칙을강제함으로써실행시점의문제를줄여주는정적타입시스템의가치도배웠다.
시간이지나면서소프트웨어에대해생각하는다른방식을발견했다.이런깨달음은다른정적타입언어인스칼라로프로그래밍을시작하면서내안에자리잡기시작했다.함수형프로그래밍은완전히새로운패러다임으로,내마음은클래스와객체에대해생각하는것에서벗어나클래스나객체안에있는함수와메서드를강조하는것으로이동했다.운좋게도스칼라를배울때는내게몇가지환상적인자료가있었다.첫번째는코세라(Coursera)에있는마틴오더스키(MartinOdersky)의훌륭한‘FunctionalProgrammingPrinciplesinScala(스칼라로배우는함수형프로그래밍원리)’라는비디오코스였다.두번째는2014년에출간된『스칼라로배우는함수형프로그래밍』(제이펍,2015))였다.‘빨간책’으로잘알려진이책은루나르비아르드나손(RunarBjarnason)과폴치우사노(PaulChiusano)가수년간자신들의경험과노력을쏟아부은결과물이었다.이두가지는내생각을형성하는데크게기여했으며,오늘날내가프로그래밍을인식하는방식을바꿔놨다.
코틀린을배우기시작했을때는코틀린이스칼라와비슷한성능을가졌음에도,실용성을특별히강조하는데비해타입시스템을사용하는함수형프로그래밍이라는학문적측면은그다지강조하지않는다는사실을깨달았다.몇몇친구와코세라에서‘KotlinforJavaDevelopers(자바개발자를위한코틀린)’코스를마친다음,우리는그스터디그룹을유지하면서코틀린에서타입을사용하는FP에대해탐구하는토대로써빨간책의내용을사용하자고이야기했다.슬프게도이모임을실제로진행하지는못했지만,내나름대로연구를더진행해서새로운코틀린FP책의개념을매닝출판사에제안했다.초기아이디어는폴과루나르의책과똑같은내용을다루되모든코드를스칼라가아닌코틀린으로변환하는것이었다.이제안을받아들여졌을때나는매우기뻤다.하지만일단집필을시작하자책은그자체로생명력이있는존재가됐고,기존의제안에서많은것이(코드뿐아니라본문까지도)달라졌다.그럼에도이책은원본인빨간책의구조를매우충실히따르고있다.
코틀린개발자를위해이책을쓰면서나자신도엄청나게성장할수있었다.그과정은훌륭한배움의경험이기도했으며,이전보다이책의개념을더심오하고풍부하게이해할수있게됐다.이책을통한여행을시작하는여러분도내가각각의페이지를적을때마다느끼고배웠던내용을최대한많이얻어가길바란다.소개하는개념을이해하면,여러분이코드를작성하는방식과그아이디어를여러분의발자국을따라오는다른사람들에게제시하는방법을영원히바꿔줄것이다.이책이내게효과가있었듯이여러분에게도효과가있길바란다.무엇보다내가그랬던것처럼여러분도이책의모든페이지에서재미를느끼고즐기게되길기대한다.
옮긴이의말
빅데이터붐이일때스칼라(Scala)와스파크(Spark)가적극적으로커뮤니티에받아들여지면서부터함수형프로그래밍에대한세간의관심이그전에비해극적으로늘어났다.이제는일반개발자사이에도함수형프로그래밍이어느정도필수적인프로그래밍패러다임으로받아들여지는분위기다.2010년대이전과비교하면,함수형프로그래밍에대한책도많이늘어났고동영상강의나관련자료도인터넷에서많이찾아볼수있게됐다.
그럼에도함수형프로그래밍을정통적으로알려주는책은그리많지않다.무엇보다일반프로그래밍언어에서타입을활용하는함수형프로그래밍의고계타입을표현하려면어려운점이많으므로,함수형패러다임과복잡한타입시스템을적극적으로지원하는하스켈(Haskell)이나스칼라같은언어를사용해함수형프로그래밍의개념을알려주는경우가많다.대표적인책으로하스켈의『가장쉬운하스켈책』(비제이퍼블릭,2014)이나이른바‘빨간책’인스칼라의『스칼라로배우는함수형프로그래밍』이있다.
반대로정적타입을지원하지않는언어(자바스크립트등)에서함수형프로그래밍을다루는책도많이있지만,타입시스템을활용하지않기때문에고계타입이주는장점을살리지못한다는한계가있다.
이책은유명한‘빨간책’의코틀린버전으로,코틀린을알고있는개발자들이함수형프로그래밍의개념을깊이배우고연습할수있도록쓰였다.새로운패러다임을배우기위해새로운프로그래밍언어를배우면,백지상태에서개념과언어를함께배울수있어완전히새로운관점에서배움을진행할수있다는장점이있다.하지만언어를배우는데드는노력으로인해개념을이해하기는더어려워질수도있다.그런점에서볼때,이책은코틀린프로그래밍언어를사용했으므로좀더쉽게함수형프로그래밍에접근할수있는길을열어준다고할수있을것이다.
이책을읽고,연습문제를모두풀어나가다보면함수형프로그래밍의개념을이해하고다양한함수형타입을설계할능력을키워나갈수있을것이다.또한,명령형코드를작성할때도학습한개념을활용해좀더우수하고안전한프로그램을작성할수있게된다.부디함수형프로그래밍에관심을갖고이책을집어든여러분이전체여정을마친후잘훈련된함수형프로그래머로거듭나길기원한다.