Kotlin in Action: 2/e (코틀린 컴파일러 개발자가 직접 알려주는 코틀린 언어 핵심 | 코루틴과 플로우 포함 코틀린 2 대응 | 반양장)
Description
안드로이드 공식 언어인 코틀린은 실용성과 간결성, 자바와의 상호 운용성으로 인해 서버 프로그래밍 등 다양한 분야에 쓰이는 경우가 늘고 있다. 코틀린 언어의 가장 큰 특징이라면 실용성을 들 수 있을 것이다. 이 책도 실용성을 강조하는 입장에서 쓰였으며, 코틀린 언어를 개발한 젯브레인즈의 코틀린 컴파일러 개발자들이 직접 쓴 일종의 공식 서적이라 할 수 있다. 2017년 초판이 나온 이래 사실상 코틀린 참고서로 자리잡은 이 책은, 코틀린 2.0에 맞춰 변경한 2판이다.
이 책은 코틀린 기초를 소개하고, 객체지향, 제네릭스, 고차 함수와 함수형 프로그래밍, 표준 컬렉션 라이브러리 활용 등의 내용을 설명한다. 이때 코틀린이 자바 언어를 어떻게 개선했고 기존 자바 프로젝트에서 코틀린을 함께 사용할 때 어떤 부분을 조심해야 할지를 함께 자세히 설명한다. 후반부는 애노테이션과 리플렉션, DSL, 비동기(일시 중단 함수와 코루틴, 플로우) 프로그래밍에 대해 실제 라이브러리 예제를 다루면서 설계 기법과 구현기법을 자세히 설명한다.
저자

세바스티안아이그너,로만엘리자로프,스베트라나이사코바,드미트리제메로프

저자:세바스티안아이그너(SebastianAigner)
젯브레인즈의개발자어드버킷이다.정기적으로콘퍼런스에서강연을하고,코틀린관련주제에대한워크숍을진행한다.토킹코틀린(TalkingKotlin)이라는코틀린팟캐스트의주최자이며공식코틀린유투브채널의비디오를제작하기도한다.코틀린재단의일원으로코틀린생태계가지속적으로성장할수있게돕고있다.

저자:로만엘리자로프(RomanElizarov)
젯브레인즈의코틀린프로젝트리드로,7년동안코틀린언어의리드설계자역할을수행하면서코틀린언어설계에집중하고있다.이전에최고의증권거래중계업체에서매초수백만건의이벤트를처리하는고성능트레이딩시스템과시장데이터제공서비스를개발했다.젯브레인즈에서코틀린을개발하면서코틀린코루틴설계와코틀린동시성라이브러리개발에기여했다.

저자:스베트라나이사코바(SvetlanaIsakova)
코틀린컴파일러팀원이었으며지금은젯브레인즈의코틀린어드버킷이다.전세계의여러콘퍼런스에서코틀린에대해강연하면서코틀린을가르치고있다.코세라(Coursera)의『KotlinforJavaDevelopers』코스의공저자이며,『아토믹코틀린』(길벗,2023)의공저자이기도하다.

저자:드미트리제메로프(DmitryJemerov)
프로젝트초기개발자중한명이며계속코틀린을개발해왔다.코틀린언어설계에대해잘알고있고코틀린언어를설계할때내린여러결정의이유도잘알고있다.젯브레인즈에재직하면서인텔리제이IDEA의코틀린플러그인이나코틀린문서화등의여러코틀린관련프로젝트에참여했다.

역자:오현석
모빌리티42이사로일하면서매일고객의요청에따라코드를만드는현업개발자다.『코틀린함수형프로그래밍』(에이콘,2023),『코틀린완벽가이드』(길벗,2022)등코틀린서적을여러권번역했고,코틀린외에도『객체에서함수로』(길벗,2025),『읽고나면진짜쉬워지는자료구조』(길벗,2024)등다양한프로그래밍언어와프로그래밍기술에대한책을번역했으며,『핵심코틀린프로그래밍』(에이콘,2023)을쓴저자이기도하다.

목차

1부코틀린소개

1장코틀린이란무엇이며,왜필요한가?
1.1코틀린맛보기
1.2코틀린의주요특성
1.2.1코틀린용례:안드로이드,서버,자바가실행되는모든곳,그외의용도
1.2.2정적타입지정으로인해코틀린성능,신뢰성,유지보수성이모두좋
아짐
1.2.3함수형프로그래밍과객체지향프로그래밍의조합이코틀린을안전하고
유연하게한다
1.2.4코루틴을쓰면동시성,비동기코드를자연스럽고구조적으로사용할수
있다
1.2.5코틀린을모든목적에사용할수있다.코틀린은오픈소스이며,여러분
의기여에대해열려있다
1.3코틀린이자주쓰이는분야
1.3.1백엔드지원:코틀린서버프로그래밍
1.3.2모바일개발:안드로이드는코틀린우선이다
1.3.3다중플랫폼:iOS,JVM,JS및그외의플랫폼에서비즈니스로직을공
유하고코드중복을최소화하기
1.4코틀린의철학
1.4.1코틀린은실용적인언어다
1.4.2코틀린은간결하다
1.4.3코틀린은안전하다
1.4.4코틀린은상호운용성이좋다
1.5코틀린도구사용
1.5.1코틀린코드설정과실행
1.5.2코틀린코드컴파일
요약

2장코틀린기초
2.1기본요소:함수와변수
2.1.1첫번째코틀린프로그램작성:Hello,World!
2.1.2파라미터와반환값이있는함수선언
2.1.3식본문을사용해함수를더간결하게정의
2.1.4데이터를저장하기위해변수선언
2.1.5변수를읽기전용변수나재대입가능변수로표시
2.1.6더쉽게문자열형식지정:문자열템플릿
2.2행동과데이터캡슐화:클래스와프로퍼티
2.2.1클래스와데이터를연관시키고,접근가능하게만들기:프로퍼티
2.2.2프로퍼티값을저장하지않고계산:커스텀접근자
2.2.3코틀린소스코드구조:디렉터리와패키지
2.3선택표현과처리:이넘과when
2.3.1이넘클래스와이넘상수정의
2.3.2when으로이넘클래스다루기
2.3.3when식의대상을변수에포획
2.3.4when의분기조건에임의의객체사용
2.3.5인자없는when사용
2.3.6스마트캐스트:타입검사와타입캐스트조합
2.3.7리팩터링:if를when으로변경
2.3.8if와when의분기에서블록사용
2.4대상이터레이션:while과for루프
2.4.1조건이참인동안코드반복:while루프
2.4.2수에대해이터레이션:범위와순열
2.4.3맵에대해이터레이션
2.4.4in으로컬렉션이나범위의원소검사
2.5코틀린에서예외던지고잡아내기
2.5.1try,catch,finally를사용한예외처리와오류복구
2.5.2try를식으로사용
요약

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코드깔끔하게다듬기:로컬함수와확장
요약

4장클래스,객체,인터페이스
4.1클래스계층정의
4.1.1코틀린인터페이스
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.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.1.6값과엮인호출가능참조
5.2자바의함수형인터페이스사용:단일추상메서드
5.2.1람다를자바메서드의파라미터로전달
5.2.2SAM변환:람다를함수형인터페이스로명시적변환
5.3코틀린에서SAM인터페이스정의:funinterface
5.4수신객체지정람다:with,apply,also
5.4.1with함수
5.4.2apply함수
5.4.3객체에추가작업수행:also
요약

6장컬렉션과시퀀스
6.1컬렉션에대한함수형API
6.1.1원소제거와변환:filter와map
6.1.2컬렉션값누적:reduce와fold
6.1.3컬렉션에술어적용:all,any,none,count,find
6.1.4리스트를분할해리스트의쌍으로만들기:partition
6.1.5리스트를여러그룹으로이뤄진맵으로바꾸기:groupBy
6.1.6컬렉션을맵으로변환:associate,associateWith,associateBy
6.1.7가변컬렉션의원소변경:replaceAll,fill
6.1.8컬렉션의특별한경우처리:ifEmpty
6.1.9컬렉션나누기:chunked와windowed
6.1.10컬렉션합치기:zip
6.1.11내포된컬렉션의원소처리:flatMap과flatten
6.2지연계산컬렉션연산:시퀀스
6.2.1시퀀스연산실행:중간연산과최종연산
6.2.2시퀀스만들기
요약

7장널이될수있는값
7.1NullPointerException을피하고값이없는경우처리:널가능성
7.2널이될수있는타입으로널이될수있는변수명시
7.3타입의의미자세히살펴보기
7.4안전한호출연산자로null검사와메서드호출합치기:?.
7.5엘비스연산자로null에대한기본값제공:?:
7.6예외를발생시키지않고안전하게타입을캐스트하기:as?
7.7널아님단언:!!
7.8let함수
7.9직접초기화하지않는널이아닌타입:지연초기화프로퍼티
7.10안전한호출연산자없이타입확장:널이될수있는타입에대한확장
7.11타입파라미터의널가능성
7.12널가능성과자바
7.12.1플랫폼타입
7.12.2상속
요약

8장기본타입,컬렉션,배열
8.1원시타입과기본타입
8.1.1정수,부동소수점수,문자,불리언값을원시타입으로표현
8.1.2양수를표현하기위해모든비트범위사용:부호없는수타입
8.1.3널이될수있는기본타입:Int?,Boolean?등
8.1.4수변환
8.1.5Any와Any?:코틀린타입계층의뿌리
8.1.6Unit타입:코틀린의void
8.1.7Nothing타입:이함수는결코반환되지않는다
8.2컬렉션과배열
8.2.1널에될수있는값의컬렉션과널이될수있는컬렉션
8.2.2읽기전용과변경가능한컬렉션
8.2.3코틀린컬렉션과자바컬렉션은밀접히연관됨
8.2.4자바에서선언한컬렉션은코틀린에서플랫폼타입으로보임
8.2.5성능과상호운용을위해객체의배열이나원시타입의배열을만들기
요약

2부코틀린을코틀린답게사용하기

9장연산자오버로딩과다른관례
9.1산술연산자를오버로드해서임의의클래스에대한연산을더편리하게만들기
9.1.1plus,times,divide등:이항산술연산오버로딩
9.1.2연산을적용한다음에그결과를바로대입:복합대입연산자오버로

9.1.3피연산자가1개뿐인연산자:단항연산자오버로딩
9.2비교연산자를오버로딩해서객체들사이의관계를쉽게검사
9.2.1동등성연산자:equals
9.2.2순서연산자:compareTo(<,>,<=,>=)
9.3컬렉션과범위에대해쓸수있는관례
9.3.1인덱스로원소접근:get과set
9.3.2어떤객체가컬렉션에들어있는지검사:in관례
9.3.3객체로부터범위만들기:rangeTo와rangeUntil관례
9.3.4자신의타입에대해루프수행:iterator관례
9.4component함수를사용해구조분해선언제공
9.4.1구조분해선언과루프
9.4.2_문자를사용해구조분해값무시
9.5프로퍼티접근자로직재활용:위임프로퍼티
9.5.1위임프로퍼티의기본문법과내부동작
9.5.2위임프로퍼티사용:bylazy()를사용한지연초기화
9.5.3위임프로퍼티구현
9.5.4위임프로퍼티는커스텀접근자가있는감춰진프로퍼티로변환된다
9.5.5맵에위임해서동적으로애트리뷰트접근
9.5.6실전프레임워크가위임프로퍼티를활용하는방법
요약

10장고차함수:람다를파라미터와반환값으로사용
10.1다른함수를인자로받거나반환하는함수정의:고차함수
10.1.1함수타입은람다의파라미터타입과반환타입을지정한다
10.1.2인자로전달받은함수호출
10.1.3자바에서코틀린함수타입사용
10.1.4함수타입의파라미터에대해기본값을지정할수있고,널이될수도
있다
10.1.5함수를함수에서반환
10.1.6람다를활용해중복을줄여코드재사용성높이기
10.2인라인함수를사용해람다의부가비용없애기
10.2.1인라이닝이작동하는방식
10.2.2인라인함수의제약
10.2.3컬렉션연산인라이닝
10.

출판사 서평

이책에서다루는내용

코틀린팀멤버들의가이드
도메인특화언어(DSL)
코틀린코루틴과플로우

이책의대상독자

주로어느정도자바경험이있는개발자를대상으로한책이다.코틀린은자바에있는여러개념과기법위에만들어졌고,이책은독자가코틀린을빠르게배울수있도록독자들의기존지식을활용한다.
C#이나자바스크립트같은다른프로그래밍언어에대한경험이있는독자라면코틀린과JVM의상호작용의복잡한측면을이해하기위해다른자료가필요하겠지만여전히이책을사용해코틀린을배울수있다.이책은코틀린언어전체를다루며,특별히구체적인문제영역에초점을맞추지는않는다.따라서서버개발자나안드로이드개발자나JVM에서실행될프로젝트를구축하는모든개발자에게도움이될것이다.

옮긴이의말

이책의1판을번역한2017년에는코틀린이안드로이드에본격적으로쓰이기시작했고스칼라,하둡등을통해함수형프로그래밍개념이슬슬메인스트림프로그래밍언어세상에들어오던시기였다.그래서1판의‘옮긴이의말’에서는관련내용을길게설명해야했다.하지만시간이지나면서안드로이드프로그래밍에서는코틀린이확고히자리잡았고,서버프로그래밍에서도코틀린을사용하는개발자나회사가많이늘어났으며,함수형프로그래밍개념도어느정도확고히자리잡았으니이제는코틀린언어의특징이나장점,함수형프로그래밍의특징이나장점을굳이설명할필요가없어졌다고생각한다.이책을집어든개발자라면코틀린이라는이름을듣고그언어의매력에빠져들준비가돼있을것이다.
코틀린은이제JVM에서자바를대신하는더나은자바의위치를벗어나자신만의동시성프로그래밍프레임워크와다중플랫폼지원을통해독자적인프로그래밍언어로서의위치를잡아가고있다.이책을통해코틀린언어의기본적인철학과문법,함수형프로그래밍의기초적기법을활용한컬렉션처리,코틀린언어의DSL지원기능을통한내부DSL과풍부한API개발방법,코틀린코루틴과플로우를통한동시/병렬프로그래밍을배울수있다.또한JVM상에서자바와코틀린을어떻게함께프로젝트에활용할수있는지도배울수있다.이책을통해튼튼한코틀린기초를갖춘개발자라면향후컴포즈다중플랫폼(composemultiplatform)을통한다중플랫폼앱개발이나스프링등자바라이브러리를통합한클린아키텍처서버개발등다양한분야에코틀린을활용할수있을것이다.예를들어역자가일하고있는(주)모빌리티42에서는자체코틀린다중플랫폼라이브러리를개발해서서버(스프링기반의자체서버라이브러리와내부DSL을활용한데이터베이스모델링),웹(자바스크립트+자체개발컴포넌트라이브러리),컴포즈데스크톱등의다양한애플리케이션을개발해사용하고있다.
아무쪼록이책을통해코틀린이여러분손에착달라붙는제대로깎은방망이처럼작업할때편하게사용할수있는도구로자리잡길바란다.그리고코틀린을통해늘어난생산성만큼독자여러분이좀더여유있는저녁이있는삶을누릴수있게되길빈다.

저자의말

코틀린언어에대한아이디어는2010년젯브레인즈에서시작했다.그시절젯브레인즈는자바,C#,자바스크립트,파이썬,루비,PHP등의다양한언어에대한개발도구를제공하는널리알려진꽤성공적인회사였다.젯브레인즈의대표제품인자바IDE인텔리제이IDEA(IntelliJIDEA)에는스칼라와그루비개발을돕는플러그인도들어있었다.
이렇게다양한언어의도구를개발해온경험으로인해우리는프로그래밍언어라는영역을전체적으로조망할수있는독특한시야와이해를얻을수있었다.그리고인텔리제이IDEA자체를포함해서인텔리제이를플랫폼으로하는모든IDE는자바로개발되고있었다.우리는모던하고강력하며빠르게진화하는언어인C#으로개발을진행하는닷넷(.Net)팀의동료들이너무부러웠지만자바를대신할만한언어를찾을수없었다.우리가자바를대신할언어에대해어떤요구사항을갖고있었을까?
처음이자가장분명한요구사항은정적타입지정(statictyping)이었다.정적타입지정외에수백만줄이나되는코드기반을,미치지않고개발할수있는다른방법은없다.둘째로기존자바코드와완전히호환되는언어가필요했다.기존코드베이스는젯브레인즈의엄청나게귀중한자산이며상호운용성이부족해서그런자산을잃어버리거나자산의가치가줄어드는일을용납할수는없었다.셋째로우리는도구제공가능성을타협하고싶지않았다.회사로서젯브레인즈에게가장중요한가치는개발생산성이며,높은생산성을얻으려면훌륭한도구가필수다.마지막으로배우기쉽고코드에대해추론하기쉬운언어가필요했다.
우리가회사내부에이렇게충족되지못한수요가있다는사실을발견했던즈음에일부회사도우리와비슷한처지에있다는사실을알게됐다.따라서젯브레인즈내부의수요를충족할수있는솔루션을만들면젯브레인즈밖에서도더많은사용자를찾을수있으리라고예상할수있었다.이를염두에두고새로운언어인코틀린을만드는프로젝트를시작하기로결정했다.
언어를개발하는과정에서처음의예상과달리개발기간이더늘어났고,코틀린1.0은최초의저장소커밋이후5년이넘는시간이지나서나왔다.그이후코틀린을원하는사용자를찾았고,자체적인생태계가훌륭히발전했으며,지금까지그런발전이계속되고있다.
코틀린은러시아의상트페테르부르크(St.Petersburg)근처에있는섬이름이다.섬이름을선택한것은자바와실론(Ceylon)언어의전통을따른것이다.
코틀린정식배포가가까워짐에따라코틀린언어를설계하는과정에관여하고코틀린언어의특성이왜현재의모습이됐는지에대해자신있게설명할수있는사람들이쓴책이한권있다면사람들에게도움이많이되리라생각했다.이책은그런노력의일환이며,독자여러분이이책을통해코틀린언어를더잘배우고이해하기를바란다.행운을빌며,여러분이항상즐겁게개발할수있기를바란다.