★이책의대상독자★
주대상독자층은스칼라로프로그램을작성하는법을배우고싶은프로그래머다.다음프로젝트를스칼라로진행하고싶다면이책이바로당신을위한것이다.또한새로운개념을배워서생각의지평을넓히고싶은프로그래머도재미있게읽을수있을것이다.예를들어,자바프로그래머는이책을읽음으로써다양한함수형프로그래밍개념을익히고더발전된객체지향아이디어도배울수있다.스칼라와그아이디어를배우고나면분명더나은프로그래머가돼있으리라믿는다.
독자여러분이일반적인프로그래밍지식을갖췄다고가정한다.스칼라자체는프로그래밍을처음배울때도적합한언어이긴하지만,이책이프로그래밍을가르쳐주지는않는다.
하지만프로그래밍언어에대한선행지식이필요하지는않다.대부분의프로그래머가스칼라를자바플랫폼에서사용하기는하지만,독자들이자바에대해알고있으리라가정하지는않는다.그러나많은독자가자바에익숙하리라예상하기때문에때때로자바와스칼라를비교해서자바개발에익숙한독자들의이해를도울것이다
★이책의구성★
1장,‘확장가능한언어’스칼라설계와그이유를설명하고,배경역사를설명한다.
2장,‘스칼라첫걸음’기초프로그래밍과업을스칼라로처리하는방법을보여준다.각각이왜작동하는지를자세히설명하지는않는다.2장의목표는독자여러분이스칼라코드를직접타이핑하고실행해보게하는것이다.
3장,‘스칼라두번째걸음’스칼라에더빨리적응할수있도록기본프로그래밍과제를좀더보여준다.3장을마치고나면간단한스크립트작업에스칼라를활용할수있을것이다.
4장,‘클래스와객체’스칼라의기본객체지향빌딩블록을자세히설명하고,스칼라애플리케이션을컴파일하고실행하는방법을보여준다.
5장,‘기본타입과연산’스칼라의기본타입과그리터럴을설명한다.그리고각타입에사용할수있는연산과우선순위및결합법칙을설명한다.마지막으로,풍부한래퍼(wrapper)에대해설명한다.
6장,‘함수형객체’스칼라의객체지향적측면을더깊이파고든다.변경불가능한함수형유리수(functionalrationalnumber)를예제로사용한다.
7장,‘내장제어구문’스칼라가제공하는제어구조인if,while,for,try,match를어떻게활용할수있는지보여준다.
8장,‘함수와클로저’함수언어의기본빌딩블록인함수에대해자세히설명한다.
9장,‘흐름제어추상화’어떻게독자가스스로제어추상화를만들어서스칼라의기본제어구조를보완할수있는지설명한다.
10장,‘상속과구성’스칼라가객체지향프로그래밍을어떻게지원하는지논의한다.다루는주제는4장만큼기초적인부분은아니지만,실무에서는더자주부딪치는부분이다.
11장,‘스칼라의계층구조’스칼라의상속계층을설명하고,모든계층에서사용할수있는일반적인메서드와바닥(최하층)타입에대해설명한다.
12장,‘트레이트’스칼라의믹스인(mixin)조합의메커니즘을다룬다.12장에서는트레이트(trait)가어떻게작동하는지를보여주고,일반적인용례를설명하며트레이트가전통적인다중상속을어떻게향상시키는지보여준다.
13장,‘패키지와임포트’대규모프로그래밍에서생기는문제점을논의한다.최상위패키지,임포트명령,protected나private같은접근제어수식자등에대해설명한다.
14장,‘단언문과테스트’스칼라의단언문(assert)메커니즘을다루고,스칼라에서사용할수있는여러테스트도구를간략히살펴본다.특히,스칼라테스트(ScalaTest)에초점을맞춰설명한다.
15장,‘케이스클래스와패턴매치’캡슐화하지않은일반적인데이터구조를작성하도록지원하는구성요소쌍을소개한다.특히케이스클래스(caseclass)와패턴매치(patternmatch)는트리구조같은재귀적데이터를만들때유용하다.
16장,‘리스트’스칼라프로그램에서가장일반적으로사용하는데이터구조인리스트에대해자세히설명한다.
17장,‘컬렉션’리스트,배열,튜플(tuple),집합(set),맵(map)같은기본스칼라컬렉션사용법을보여준다.
18장,‘변경가능한객체’변경가능한객체를설명하고,스칼라에서이를표현하는방법을배운다.18장뒷부분에서는변경가능한객체를실제활용하는이산이벤트시뮬레이션(discreteeventsimulation)을다룬다.
19장,‘타입파라미터화’13장에서소개한정보은닉기법의일부를구체적인예를들어설명한다.예제는완전히함수형인큐클래스를만드는것이다.19장에서는타입파라미터의변성(variance)에대해설명하고,변성과정보은닉의관계를이야기한다.
20장,‘추상멤버’스칼라가지원하는모든추상멤버를설명한다.메서드뿐아니라필드나타입도추상멤버로정의할수있다.
21장,‘암시적변환과암시적파라미터’소스코드에서프로그래머가지겨워할수있는부분을생략해도컴파일러가대신필요한내용을채워넣도록돕는두가지요소를알려준다.
22장,‘리스트구현’List클래스구현을설명한다.스칼라리스트가어떻게동작하는지이해하는일은중요하다.더나아가,이구현을통해스칼라의특징중몇가지를활용하는방법을보여주기도한다.
23장,‘for표현식다시보기’for표현식을어떻게map,flatMap,filter,foreach등을호출하는명령으로바꿀수있는지보여준다.
24장,‘컬렉션자세히들여다보기’스칼라컬렉션라이브러리를자세히설명한다.
25장,‘스칼라컬렉션의아키텍처’컬렉션라이브러리를어떻게만들었는지보여주고,독자여러분이컬렉션을직접구현하는방법을설명한다.
26장,‘익스트랙터’케이스클래스뿐아니라,임의의클래스에대해패턴매치를어떻게할수있는지보여준다.
27장,‘애노테이션’애노테이션(annotation)을통한언어확장을사용하는방법을알려준다.표준애노테이션에대해설명하고,직접애노테이션을만드는방법도알아본다.
28장,‘XML다루기’스칼라로XML을처리하는방법을설명한다.XML을생성하고,파싱하고,파싱한XML을처리할수있는여러숙어를보여준다.
29장,‘객체를사용한모듈화프로그래밍’스칼라의객체를모듈시스템으로활용하는방법을알려준다.
30장,‘객체의동일성’equals메서드를작성할때고려해야할사항을설명한다.피해야할함정이몇가지있다.
31장,‘스칼라와자바의결합’스칼라와자바를한프로젝트에서함께사용할경우생기는문제를논의하고,그해결책을제안한다.
32장,‘퓨처와동시성’스칼라의Future사용법을보여준다.자바의동시성기본요소나라이브러리를스칼라프로그램에활용할수도있지만,퓨처를사용하면전통적인‘스레드와락’을사용한접근방식을감염시키곤하는교착상태와경합조건을피하는데도움이된다.
33장,‘콤비네이터파싱’스칼라의파서콤비네이터(parsercombinator)라이브러리를사용해파서를만드는방법을보여준다.
34장,‘GUI프로그래밍’스칼라라이브러리로간단한스윙GUI프로그래밍을하는과정을보여준다.
35장,‘SCells스프레드시트’지금까지배운것을한데모아서스칼라로완전한스프레드시트애플리케이션을작성한다.
★추천의글★
2004년프로그래밍을시작하면서당시잘알려지지않았던언어인스칼라를선택했을때만해도,내가어떤탐험과발견의항해를떠나고있는지를미처깨닫지못했다.
처음스칼라를실험했을때는그전에사용해본다른언어와거의비슷했지만이후시행착오,실험을통한발견,오해후의깨달음등이있었다.당시에는스칼라를배울만한문서가거의없고자습서나블로그,나를가르쳐줄만큼스칼라경험이많은사용자도없었다.당연히『ProgramminginScala』같은책도없었다.놀랄만큼새로운기능을제공하는언어만있고누구도이런기능을제대로쓰는법을확실히알지못했다.그런상황은의욕이넘치게하는동시에당황스럽기도했다!
자바개발자로지내며경험한내용으로프로그래밍방식은예상할수있었지만,매일매일스칼라로일상적인코딩을진행해본경험은다르게느껴졌다.초반에스칼라사용법을배우는모험을했던것과중간규모의프로젝트를다른사람들과진행했던일이생각난다.리팩토링을하기로결정한적도있고(계속해서새로운특징과패턴을발견하고배움에따라리팩토링을꽤자주해야했다),컴파일을여러번해야했던적도있다.
컴파일러는매번다양한오류를소스코드줄번호와함께뱉어냈다.그럴때마다해당코드를살펴보고,어떤부분이잘못됐는지알아낸다음,오류를고치기위해코드를수정했다(물론코드를수정하면서오류가다른위치로옮겨간경우도자주있다).하지만이런단계마다컴파일러가정확히문제의근원으로나를이끌어줬다.때로는한번도컴파일에성공하지못하고며칠동안코드수정을반복한적도있다.하지만컴파일오류숫자를몇백개에서십여개로줄이고,다시이런오류를하나로줄이고,결국에는오류를없애면서(즉,컴파일에성공했다는말이다)아주많이리팩토링을거친소프트웨어를처음실행할수있었다.
그리고내예상과다르게컴파일이된코드는처음부터잘실행됐다.자바,펄,파스칼,베이직,PHP,자바스크립트만경험해봤던젊은프로그래머였던나에게,이런경험이얼마나인상적이었는지말로는제대로표현할수가없다.
2015년내가조직했던스칼라월드(ScalaWorld)콘퍼런스키노트에서루나비야나슨(R?narBjarnason)은“제약은자유를주고자유는제약을가한다.”라고주장했다.이말이사실임은스칼라로컴파일할때가장극명하게드러난다.scalac가여러가지제약사항을강제로부여하는주목적은실행시점에발생할것으로예상되는오류(여러오류중이런오류가최악이다)를프로그래머가저지르지못하게하는것이고,이는모든프로그래머를자유롭게해준다.이로인해종합적인테스트스위트가없어도프로그래머가자신감을가지고실험하고,탐험하고,소프트웨어를마음대로바꿀수있다.
그로부터몇년이지났고,나는오늘날까지계속스칼라를배우면서새로운가능성,미묘한의미차이,여러기능간의흥미로운상호작용등을발견하고있다.이렇게여러해동안사용자가열중할수있을정도의깊이를제공하는다른프로그래밍언어가있는지모르겠다.
스칼라는엄청난변화의시기를겪으려한다.다음에나올주버전인스칼라3은15년전내가자바에서스칼라2로옮겨왔을때만큼큰변화를포함할것이다.스칼라를사용하는매일매일의프로그래밍경험은거의그대로유지되겠지만,스칼라언어의거의전영역을관통하는새로운특성레퍼토리가스칼라3에들어온다.이글을쓰고있는지금,스칼라3이폭넓게도입되려면몇년이더걸리고,여전히당분간은스칼라2가사실상표준역할을할것이다.
이책은스칼라2최신릴리스인스칼라2.13을폭넓게다룬다.또한스칼라2.8에서도입했던대규모재설계이후알게된내용을포함시키면서구조를더단순화하기위해재설계해서표준라이브러리에도입된컬렉션라이브러리를소개한다.새컬렉션라이브러리는스칼라2나3에서모두컴파일될수있다.따라서다음10년간사용할코드의기반을이컬렉션라이브러리가제공하게된다.따라서새로운스칼라의등장에흥분하기에앞서,이책을집어들고공부를시작하기에아주좋은때다!
존프레티(JonPretty)
폴란드크라쿠프,2019년9월12일