Kotlin in Action 코틀린 컴파일러 개발자가 직접 알려주는 코틀린 언어 핵심
저자

드미트리제메로프,스베트라나이사코바

저자드미트리제메로프(DmitryJemerov)는2003년부터젯브레인스에서일해왔으며,인텔리J아이디어,파이참,웹스톰등의여러제품개발에참여했다.초기코틀린기여자중하나로최초코틀린바이트코드생성기를만들었으며,전세계에서코틀린관련발표를진행해왔다.현재코틀린인텔리J플러그인을개발하는팀을이끌고있다.

목차

1장.코틀린이란무엇이며,왜필요한가?
__1.1코틀린맛보기
__1.2코틀린의주요특성
____1.2.1대상플랫폼:서버,안드로이드등자바가실행되는모든곳
____1.2.2정적타입지정언어
____1.2.3함수형프로그래밍과객체지향프로그래밍
____1.2.4무료오픈소스
__1.3코틀린응용
____1.3.1코틀린서버프로그래밍
____1.3.2코틀린안드로이드프로그래밍
__1.4코틀린의철학
____1.4.1실용성
____1.4.2간결성
____1.4.3안전성
____1.4.4상호운용성
__1.5코틀린도구사용
____1.5.1코틀린코드컴파일
____1.5.2인텔리J아이디어와안드로이드스튜디오의코틀린플러그인
____1.5.3대화형셸
____1.5.4이클립스플러그인
____1.5.5온라인놀이터
____1.5.6자바-코틀린변환기
__1.6요약
2장.코틀린기초
__2.1기본요소:함수와변수
____2.1.1Hello,World!
____2.1.2함수
____2.1.3변수
____2.1.4더쉽게문자열형식지정:문자열템플릿
__2.2클래스와프로퍼티
____2.2.1프로퍼티
____2.2.2커스텀접근자
____2.2.3코틀린소스코드구조:디렉터리와패키지
__2.3선택의표현과처리:enum과when
____2.3.1enum클래스정의
____2.3.2when으로enum클래스다루기
____2.3.3when과임의의객체를함께사용
____2.3.4인자없는when사용
____2.3.5스마트캐스트:타입검사와타입캐스트를조합
____2.3.6리팩토링:if를when으로변경
____2.3.7if와when의분기에서블록사용
__2.4대상을이터레이션:while과for루프
____2.4.1while루프
____2.4.2숫자에대한이터레이션:범위와수열
____2.4.3맵에대한이터레이션
____2.4.4in으로컬렉션이나범위의원소검사
__2.5코틀린의예외처리
____2.5.1try,catch,finally
____2.5.2try를식으로사용
__2.6요약
3장.함수정의와호출
__3.1코틀린에서컬렉션만들기
__3.2함수를호출하기쉽게만들기
____3.2.1이름붙인인자
____3.2.2디폴트파라미터값
____3.2.3정적인유틸리티클래스없애기:최상위함수와프로퍼티
____3.3메소드를다른클래스에추가:확장함수와확장프로퍼티
____3.3.1임포트와확장함수
____3.3.2자바에서확장함수호출
____3.3.3확장함수로유틸리티함수정의
____3.3.4확장함수는오버라이드할수없다
____3.3.5확장프로퍼티
__3.4컬렉션처리:가변길이인자,중위함수호출,라이브러리지원
____3.4.1자바컬렉션API확장
____3.4.2가변인자함수:인자의개수가달라질수있는함수정의
____3.4.3값의쌍다루기:중위호출과구조분해선언
__3.5문자열과정규식다루기
____3.5.1문자열나누기
____3.5.2정규식과3중따옴표로묶은문자열
____3.5.3여러줄3중따옴표문자열
__3.6코드다듬기:로컬함수와확장
__3.7요약
4장.클래스,객체,인터페이스
__4.1클래스계층정의
____4.1.2코틀린인터페이스
____4.1.2open,final,abstract변경자:기본적으로final
____4.1.3가시성변경자:기본적으로공개
____4.1.4내부클래스와중첩된클래스:기본적으로중첩클래스
____4.1.5봉인된클래스:클래스계층정의시계층확장제한
__4.2뻔하지않은생성자와프로퍼티를갖는클래스선언
____4.2.1클래스초기화:주생성자와초기화블록
____4.2.2부생성자:상위클래스를다른방식으로초기화
____4.2.3인터페이스에선언된프로퍼티구현
____4.2.4게터와세터에서뒷받침하는필드에접근
____4.2.5접근자의가시성변경
__4.3컴파일러가생성한메소드:데이터클래스와클래스위임
____4.3.1모든클래스가정의해야하는메소드
____4.3.2데이터클래스:모든클래스가정의해야하는메소드자동생성
____4.3.3클래스위임:by키워드사용
__4.4object키워드:클래스선언과인스턴스생성
____4.4.1객체선언:싱글턴을쉽게만들기
____4.4.2동반객체:팩터리메소드와정적멤버가들어갈장소
____4.4.3동반객체를일반객체처럼사용
____4.4.4객체식:익명내부클래스를다른방식으로작성
__4.5요약
5장.람다로프로그래밍
__5.1람다식과멤버참조
____5.1.1람다소개:코드블록을함수인자로넘기기
____5.1.2람다와컬렉션
____5.1.3람다식의문법
____5.1.4현재영역에있는변수에접근
____5.1.5멤버참조
__5.2컬렉션함수형API
____5.2.1필수적인함수:filter와map
____5.2.2all,any,count,find:컬렉션에술어적용
____5.2.3groupBy:리스트를여러그룹으로이뤄진맵으로변경
____5.2.4flatMap과flatten:중첩된컬렉션안의원소처리
__5.3지연계산lazy컬렉션연산
____5.3.1시퀀스연산실행:중간연산과최종연산
____5.3.2시퀀스만들기
__5.4자바함수형인터페이스활용
____5.4.1자바메소드에람다를인자로전달
____5.4.2SAM생성자:람다를함수형인터페이스로명시적으로변경
__5.5수신객체지정람다:with와apply
____5.5.1with함수
____5.5.2apply함수
__5.6요약
6장.코틀린타입시스템
__6.1널가능성
____6.1.1널이될수있는타입
____6.1.2타입의의미
____6.1.3안전한호출연산자:"?."
____6.1.4엘비스연산자"?:"
____6.1.5안전한캐스트:as?
____6.1.6널아님단언:!!
____6.1.7let함수
____6.1.8나중에초기화할프로퍼티
____6.1.9널이될수있는타입확장
____6.1.10타입파라미터의널가능성
____6.1.11널가능성과자바
__6.2코틀린의기본타입
____6.2.1기본타입:Int,Boolean등
____6.2.2널이될수있는기본타입:Int?,Boolean?등
____6.2.3숫자변환
____6.2.4Any,Any?:최상위타입
____6.2.5Unit타입:코틀린의void
____6.2.6Nothing타입:“이함수는결코정상적으로끝나지않는다.”
__6.3컬렉션과배열
____6.3.1널가능성과컬렉션
____6.3.2읽기전용과변경가능한컬렉션
____6.3.3코틀린컬렉션과자바
____6.3.4컬렉션을플랫폼타입으로다루기
____6.3.5객체의배열과기본타입의배열
__6.4요약
2부.코틀린답게사용하기
7장.연산자오버로딩과기타관례
__7.1산술연산자오버로드
____7.1.1이항산술연산오버로딩
____7.1.2복합대입연산자오버로딩
____7.1.3단항연산자오버로딩
__7.2비교연산자오버로딩
____7.2.1동등성연산자:"equals"
____7.2.2순서연산자:compareTo
____7.3컬렉션과범위에대해쓸수있는관례
____7.3.1인덱스

출판사 서평

★이책의대상독자★
어느정도자바경험이있는개발자를주요대상으로한다.코틀린은자바에있는여러개념과기법위에만들어졌고,이책은독자들이코틀린을빠르게배울수있도록독자들의기존지식을활용한다.자바를배운지얼마되지않았거나C#이나자바스크립트와같은다른언어에대한경험은있지만자바를잘모르는독자들은코틀린과JVM의상호작용의복잡한측면을이해하기위해다른자료가필요할것이다.하지만그런독자라도여전히이책을사용해코틀린을배울수있다.우리는코틀린언어전체를다...
★이책의대상독자★
어느정도자바경험이있는개발자를주요대상으로한다.코틀린은자바에있는여러개념과기법위에만들어졌고,이책은독자들이코틀린을빠르게배울수있도록독자들의기존지식을활용한다.자바를배운지얼마되지않았거나C#이나자바스크립트와같은다른언어에대한경험은있지만자바를잘모르는독자들은코틀린과JVM의상호작용의복잡한측면을이해하기위해다른자료가필요할것이다.하지만그런독자라도여전히이책을사용해코틀린을배울수있다.우리는코틀린언어전체를다루며,특별히구체적인영역에초점을맞추지는않는다.따라서이책은서버개발자나안드로이드개발자,또는JVM에서실행될프로젝트를구축하는모든개발자에게도움이될것이다.
★이책의구성★
이책은2부로구성했다.
1부는코틀린을기존라이브러리나API와함께사용하는방법을설명한다.
1장은코틀린의핵심목표,가치,적용영역에대해알려준다.또한코틀린코드를실행하는여러가지방법을보여준다.
2장은모든코틀린프로그램의핵심요소인제어구조,변수,함수선언등을설명한다.
3장은코틀린에서함수를정의하는방법을자세히다루고,확장함수(extensionfunction)와프로퍼티(property)개념을소개한다.
4장은클래스선언에초점을맞춰설명하고,데이터클래스(dataclass)와동반객체(companionobject)에대해다룬다.
5장은코틀린람다(lambda)사용법을설명하고람다를사용하는코틀린표준라이브러리함수를몇가지보여준다.
6장은코틀린타입시스템에대해다룬다.특히널가능성(nullability)과컬렉션에초점을맞춰설명한다.
2부는여러분자신이코틀린을활용해API를선언하고추상화를정의하는방법을알려주고,코틀린언어의더깊은특성을다룬다.
7장은관례(convention)라는원리를설명한다.관례는미리정해진이름인함수나프로퍼티에특별한의미를부여한다.또한위임프로퍼티(delegatedproperty)라는개념을소개한다.
8장은함수를파라미터로받거나함수를반환하는함수인고차함수를선언하는방법을설명한다.또한인라인함수개념을소개한다.
9장은코틀린제네릭스개념을자세히다룬다.먼저기본문법을설명하고실체화한(reified)타입파라미터나타입변성(typevariance)과같은더어려운주제를설명한다.
10장은제이키드(JKid)라는실전에가능한작은JSON직렬화라이브러리를통해애노테이션과리플렉션사용법을다룬다.
11장은영역특화언어DSL개념을소개하고,코틀린의DSL지원기능을설명하며,여러DSL예제를살펴본다.
또한4개의부록이있다.
부록A는그레이들(Gradle),메이븐(Maven),앤트(Ant)에서코틀린코드를빌드하는방법을설명한다.
부록B는코틀린모듈에대해문서화주석을사용하는방법과API문서를생성하는방법을알려준다.
부록C는코틀린에코시스템에있는여러라이브러리나프레임워크를소개하고최신정보를온라인에서얻는방법을알려준다.
부록D는한국어판에만추가한것으로코틀린1.1,1.2(베타버전,향후변경가능성있음)과그이전버전의차이를간략히정리했다.
이책은전체를차례대로읽을때가장효과가좋다.하지만관심분야를다루는장을찾아서읽거나잘모르는개념을마주칠때색인을통해필요한부분을찾아보면서이책을활용하는것도좋다.
★옮긴이의말★
학교특히대학원에서는컴파일러와함수형프로그래밍을주로공부했지만회사에들어온후자바와C,C++개발을10여년진행해왔다.호주로오고나서스칼라를접했고함수형프로그래밍이라는말이여러프로그래머사이에회자되는모습을보면서격세지감을느끼기시작했다.스칼라를공부하면서90년대초중반학교에서공부했던내용을JVM환경에잘버무린스칼라언어특징을지켜보며스칼라를설계한마틴오더스키에게경탄했다.스칼라가주는간결한코드의매력에푹빠져계속공부를하면서고차함수를넘어서는타입시스템이나고계타입(higher-kindedtype)등을스칼라로구현한스칼라제드나CAT등의라이브러리도살펴봤다.타입을활용한강력한추상화는하스켈이나스칼라등하드코어함수형프로그래밍언어의마약과도같은장점이긴하지만,실무에서그런기능으로버무려둔코드가얼마나유지보수성이있을까하는의문이머릿속을떠나지않았다.기능을추가하고더고차원적인추상화를가능케하기보다는오히려기능을제약하고추상화방법을제한하되초보부터고수까지다이해하기쉽고유지보수하기쉬운언어를만들어야하는게아닐까?2014년애플이스위프트를발표하고,비슷한때코틀린이라는언어가우연히시야에들어왔다.두언어는각각오브젝티브C와자바라는언어를개선하면서도스칼라처럼너무큰변화를추구하지는않는실용적인접근방식을택한언어라는점과,널가능성처리와람다구문등에서비슷한점이많았다.어쩌면스칼라가택한접근방법보다는스위프트나코틀린이택한접근방법이현실적으로적용하기엔더쉽지않을까하는생각으로관심을갖고코틀린을지켜봤다.특히안드로이드라는환경이중요하고개발자들이따로공부에투자할시간이절대적으로부족한한국의현실에서는코틀린이더욱쓸모가있을것같았다.그리고코틀린이2017년안드로이드공식언어가되면서한국에서도코틀린에대한관심이폭발적으로늘어나는모습을볼수있었다.
언어적으로볼때코틀린은그다지새로운언어가아니다.코틀린이제공하는여러기능을살펴보면정말자바를개선하기위해많은부분에서고민을했다는느낌이많이든다.학술적으로가치가있거나소위힙스터프로그래머들의관심을끌만한기능은거의없다.함수를표현하는인터페이스로데이터타입이나함수를표현해서객체지향과통합하는방법등은이제다양한언어에서채용하고있는잘알려진기법이다.모나드를쉽게활용할수있게해주는for컴프리핸션이나패턴매치,고계타입(higher-kindedtype)등함수형프로그래밍언어에서는당연히제공하는기능도아직제공하지않는다.
하지만‘방망이깎던노인’이방망이를깎던것처럼여러해동안실제IDE개발에코틀린을사용하면서얻은피드백을바탕으로이해하기쉽고개발자손에착달라붙으면서도기존자바소스와함께사용하기편리한언어를만들어냈다.코틀린이자바에추가한여러기능은커다란추가런타임라이브러리가필요할정도로양이많지는않지만,자바의가려움을긁어줄만한내용들이들어있다.그러면서도너무복잡하거나너무어렵지는않아다양한수준의개발자가함께참여해야하는실전프로젝트에서사용하기에딱좋다.게다가기존자바라이브러리와의호환성을중시하면서개발해왔기때문에상대적으로JVM에서기존자바에코시스템을활용하기쉽다는장점도있다.어쩌면코틀린은최신언어라고부르기엔너무구식특성만을가진언어일지도모른다.그러나대규모개발과유지보수성,기존자바시스템과의호환성등을고려해본다면가장강력한자바대체재라고볼수있다.
이책은코틀린언어를개발하는젠브레인개발자가직접쓴책이다.물론이