코틀린 코루틴의 정석 : 기초부터 심화까지 알아보는
Description
많은 개발자들이 어렵게 느끼는 비동기 프로그래밍을 다양한 시각적 자료와 이해하기 쉬운 설명을 통해 누구나 쉽게 이해할 수 있도록 설명한다. 안드로이드, 스프링 등 코틀린을 사용하는 개발자들 중 코루틴을 사용한 비동기 프로그래밍을 기초부터 심화까지 제대로 배워보고 싶은 독자들에게 추천한다.
저자

조세영

저자:조세영
취미로안드로이드개발을시작했다가빠져들어안드로이드개발자가됐다.하이퍼커넥트에서안드로이드개발자로서커리어를시작했고,현재는라인플러스에서라인안드로이드앱을개발하고있다.
안드로이드개발을하면서어려움을느낀부분들을다른사람들과공유하고싶어‘조세영의KotlinWorld’기술블로그를운영하며400개이상의글을발행했다.
블로그운영외에도기술과관련된다양한활동을하고있다.코루틴기술문서를번역해웹에배포하기도했고,ComposeDynamicTheme이나FilledSliderCompose같은오픈소스라이브러리를만들어배포해GoogleDevLibrary에소개되기도했다.
경력
현)라인플러스안드로이드개발자
전)하이퍼커넥트안드로이드개발자
전)티맥스데이터연구원
전)인공위성연구소대학원생연구원
학력
KAIST전기및전자공학부석사
고려대학교전기전자전파공학부학사
고려대학교보건정책관리학부학사
인천외국어고등학교졸업

목차

1장.스레드기반작업의한계와코루틴의등장
1.1.JVM프로세스와스레드
1.2.단일스레드의한계와멀티스레드프로그래밍
1.2.1.단일스레드애플리케이션의한계
1.2.2.멀티스레드프로그래밍을통한단일스레드의한계극복
1.3.스레드,스레드풀을사용한멀티스레드프로그래밍
1.3.1.Thread클래스를사용하는방법과한계
1.3.2.Executor프레임웍을통해스레드풀사용하기
1.3.3.이후의멀티스레드프로그래밍과한계
1.4.기존멀티스레드프로그래밍의한계와코루틴
1.4.1.기존멀티스레드프로그래밍의한계
1.4.2.코루틴은스레드블로킹문제를어떻게극복하는가?
1.5.요약

2장.코루틴개발환경설정
2.1.인텔리제이아이디어설치및둘러보기
2.1.1.인텔리제이아이디어설치하기58
2.2.코틀린프로젝트생성하고화면구성살펴보기
2.2.1.프로젝트생성하기
2.2.2.IDE구성살펴보기
2.3.첫코루틴실행하기
2.3.1.코루틴라이브러리추가하기
2.3.2.첫코루틴실행하기
2.4.코루틴디버깅환경설정하기
2.4.1.실행중인스레드출력하기
2.4.2.실행중인코루틴이름출력하기
2.4.3.launch사용해코루틴추가로실행하기
2.4.4.CoroutineName사용해코루틴에이름추가하기
2.5.요약

3장.CoroutineDispatcher
3.1.CoroutineDispatcher란무엇인가?
3.1.1.CoroutineDispatcher의동작살펴보기
3.1.2.CoroutineDispatcher의역할
3.2.제한된디스패처와무제한디스패처
3.3.제한된디스패처생성하기
3.3.1.단일스레드디스패처만들기
3.3.2.멀티스레드디스패처만들기
3.4.CoroutineDispatcher사용해코루틴실행하기
3.4.1.launch의파라미터로CoroutineDispatcher사용하기
3.4.2.부모코루틴의CoroutineDispatcher사용해자식코루틴실행하기
3.5.미리정의된CoroutineDispatcher
3.5.1.Dispatchers.IO
3.5.2.Dispatchers.Default
3.5.3.limitedParallelism사용해Dispatchers.Default스레드사용제한하기
3.5.4.공유스레드풀을사용하는Dispatchers.IO와Dispatchers.Default4
3.5.5.Dispatchers.Main
3.6.요약

4장.코루틴빌더와Job
4.1.join을사용한코루틴순차처리
4.1.1.순차처리가안될경우의문제
4.1.2.join함수사용해순차처리하기
4.2.joinAll을사용한코루틴순차처리
4.2.1.joinAll함수
4.2.2.joinAll함수사용해보기
4.3.CoroutineStart.LAZY사용해코루틴지연시작하기
4.3.1.지연시작을살펴보기위한준비
4.3.2.CoroutineStart.LAZY사용해코루틴지연시작하기
4.4.코루틴취소하기
4.4.1.cancel사용해Job취소하기
4.4.2.cancelAndJoin을사용한순차처리
4.5.코루틴의취소확인
4.5.1.delay를사용한취소확인
4.5.2.yield를사용한취소확인
4.5.3.CoroutineScope.isActive를사용한취소확인
4.6.코루틴의상태와Job의상태변수
4.6.1.Job의상태를출력하는함수만들기
4.6.2.생성상태의코루틴
4.6.3.실행중상태의코루틴
4.6.4.실행완료상태의코루틴
4.6.5.취소중인코루틴
4.6.6.취소완료된코루틴
4.6.7.상태정리
4.7.요약

5장.async와Deferred
5.1.async사용해결괏값수신하기
5.1.1.async사용해Deferred만들기
5.1.2.await를사용한결괏값수신
5.2.Deferred는특수한형태의Job이다
5.3.복수의코루틴으로부터결괏값수신하기
5.3.1.await를사용해복수의코루틴으로부터결괏값수신하기
5.3.2.awaitAll을사용한결괏값수신
5.3.3.컬렉션에대해awaitAll사용하기
5.4.withContext
5.4.1.withContext로async-await대체하기
5.4.2.withContext의동작방식
5.4.3.withContext사용시주의점
5.5.요약

6장.CoroutineContext
6.1.CoroutineContext의구성요소
6.2.CoroutineContext구성하기
6.2.1.CoroutineContext가구성요소를관리하는방법
6.2.2.CoroutineContext구성
6.2.3.CoroutineContext구성요소덮어씌우기
6.2.4.여러구성요소로이뤄진CoroutineContext합치기
6.2.5.CoroutineContext에Job생성해추가하기
6.3.CoroutineContext구성요소에접근하기
6.3.1.CoroutineContext구성요소의키
6.3.2.키를사용해CoroutineContext구성요소에접근하기
6.4.CoroutineContext구성요소제거하기
6.4.1.minusKey사용해구성요소제거하기
6.4.2.minusKey함수사용시주의할점
6.5.요약

7장.구조화된동시성
7.1.실행환경상속
7.1.1.부모코루틴의실행환경상속
7.1.2.실행환경덮어씌우기
7.1.3.상속되지않는Job
7.1.4.구조화에사용되는Job
7.2.코루틴의구조화와작업제어
7.2.1.취소의전파
7.2.2.부모코루틴의자식코루틴에대한완료의존성
7.3.CoroutineScope사용해코루틴관리하기
7.3.1.CoroutineScope생성하기
7.3.2.코루틴에게실행환경을제공하는CoroutineScope
7.3.3.CoroutineScope에속한코루틴의범위
7.3.4.CoroutineScope취소하기
7.3.5.CoroutineScope활성화상태확인하기
7.4.구조화와Job
7.4.1.runBlocking과루트Job
7.4.2.Job구조화깨기
7.4.3.Job사용해일부코루틴만취소되지않게만들기
7.4.4.생성된Job의부모를명시적으로설정하기
7.4.5.생성된Job은자동으로실행완료되지않는다
7.5.요약

8장.예외처리
8.1.코루틴의예외전파
8.1.1.코루틴에서예외가전파되는방식
8.1.2.예제로알아보는예외전파
8.2.예외전파제한
8.2.1.Job객체를사용한예외전파제한
8.2.2.SupervisorJob객체를사용한예외전파제한
8.2.3.supervisorScope를사용한예외전파제한
8.3.CoroutineExceptionHandler를사용한예외처리
8.3.1.CoroutineExceptionHandler생성
8.3.2.CoroutineExceptionHandler사용
8.3.3.처리되지않은예외만처리하는CoroutineExceptionHandler
8.3.4.CoroutineExceptionHandler가예외를처리하도록만들기
8.3.5.CoroutineExceptionHandler는예외전파를제한하지않는다
8.4.trycatch문을사용한예외처리
8.4.1.trycatch문을사용해코루틴예외처리하기
8.4.2.코루틴빌더함수에대한trycatch문은코루틴의예외를잡지못한다
8.5.async의예외처리
8.5.1.async의예외노출
8.5.2.async의예외전파
8.6.전파되지않는예외
8.6.1.전파되지않는CancellationException
8.6.2.코루틴취소시사용되는JobCancellationException
8.6.3.withTimeOut사용해코루틴의실행시간제한하기
8.7.요약

9장.일시중단함수
9.1.일시중단함수와코루틴
9.1.1.일시중단함수란무엇인가?
9.1.2.일시중단함수는코루틴이아니다
9.1.3.일시중단함수를별도의코루틴상에서실행하기
9.2.일시중단함수의사용
9.2.1.일시중단함수의호출가능지점
9.2.2.일시중단함수에서코루틴실행하기
9.3.요약

10장.코루틴의이해
10.1.서브루틴과코루틴
10.1.1.루틴과서브루틴
10.1.2.서브루틴과코루틴의차이
10.2.코루틴의스레드양보
10.2.1.delay일시중단함수를통해알아보는스레드양보
10.2.2.join과await의동작방식자세히알아보기
10.2.3.yield함수호출해스레드양보하기
10.3.코루틴의실행스레드
10.3.1.코루틴의실행스레드는고정이아니다
10.3.2.스레드를양보하지않으면실행스레드가바뀌지않는다
10.4.요약

11장.코루틴심화
11.1.공유상태를사용하는코루틴의문제와데이터동기화
11.1.1.가변변수를사용할때의문제점
11.1.2.JVM의메모리공간이하드웨어메모리구조와연결되는방식
11.1.3.공유상태에대한메모리가시성문제와해결방법
11.1.4.공유상태에대한경쟁상태문제와해결방법
11.2.CoroutineStart의다양한옵션들살펴보기
11.2.1.CoroutineStart.DEFAULT
11.2.2.CoroutineStart.ATOMIC
11.2.3.CoroutineStart.UNDISPATCHED
11.3.무제한디스패처
11.3.1.무제한디스패처란?
11.3.2.무제한디스패처의특징
11.4.코루틴의동작방식과Continuation
11.4.1.ContinuationPassingStyle
11.4.2.코루틴의일시중단과재개로알아보는Continuation
11.4.3.다른작업으로부터결과수신해코루틴재개하기
11.5.요약

12장.코루틴단위테스트
12.1.단위테스트기초
12.1.1.단위테스트란무엇인가?
12.1.2.테스트

출판사 서평

이책에서다루는내용

풍부한시각적자료를통해초보개발자라도코루틴을사용한비동기프로그래밍을쉽게이해할수있도록설명한다.
코루틴이전의멀티스레드프로그래밍이어떤한계를가졌는지,코루틴이그한계를어떻게극복했는지를설명한다.
CoroutineContext를구성하는다양한구성요소의활용방법을설명한다.
코루틴의구조화된동시성과예외처리방법을알아보고비동기프로그래밍을안정적으로하는방법을설명한다.
코루틴의동작방식에대한심층적인이해를위한자료를제공한다.
코루틴유닛테스트를작성하는방법에대해기초부터심화까지설명한다.

이책의대상독자

코틀린코루틴에대한지식을기초부터핵심까지탄탄하게쌓고싶은개발자
코루틴의다양한기능들을심층적으로이해해기술적으로성장하고싶은개발자
코루틴의구조화된동시성과예외처리를이해해비동기프로그래밍을보다안정적으로하는방법을배우고싶은개발자
코루틴의동작원리를이해하고싶은개발자
코루틴유닛테스트를작성하는방법을배우고싶은개발자

이책의구성

1장에서는JVM의프로세스,스레드에대해다룬다.기존멀티스레드프로그래밍이어떤방식으로변화했고,코루틴이기존멀티스레드프로그래밍의한계를어떻게극복했는지알아본다.
2장에서는인텔리제이아이디어를사용해코루틴개발환경을설정하는방법에대해다룬다.개발환경을설정한후에는첫코루틴을실행해보고,어떤스레드에서코루틴이실행중인지확인하는방법에대해서도알아본다.
3장에서는CoroutineDispatcher에대해다룬다.제한된디스패처를만드는방법과제한된디스패처를사용해코루틴을실행시키는방법을설명한다.코루틴라이브러리는사용자의편의를위해미리정의된CoroutineDispatcher를제공하므로미리정의된CoroutineDispatcher에는어떤종류가있고언제사용해야하는지살펴본다.
4장에서는코루틴빌더함수인launch와launch호출시반환되는Job객체를다룬다.코루틴은일시중단이가능하므로작업간의순차처리가매우중요하다.Job객체의join함수를사용해코루틴간의순차처리방법과Job객체를통해코루틴의상태를조작하고상태값을확인하는방법에대해알아본다.
5장에서는async코루틴빌더에대해설명한다.async와await를사용해코루틴으로부터반환값을받는방법에대해알아보고,코루틴을실행중인스레드의변경을위해withContext를사용하는방법에대해서도살펴본다.
6장에서는CoroutineContext에대해알아본다.Job,CoroutineDispatcher,CoroutineName이CoroutineContext의구성요소라는것을이해하고,CoroutineContext의구성요소를결합하거나분리하는방법을살펴본다.
7장에서는코루틴을안전하게사용하게위해구조화된동시성이어떻게사용되는지부모코루틴과자식코루틴의관계를중심으로알아본다.이후에는구조화에중요한역할을하는CoroutineScope를알아보고,구조화의중심에Job이있다는것을살펴본다.
8장에서는예외처리에대해다룬다.코루틴에서예외가발생했을때어떻게전파되는지알아보고예외전파가구조화된동시성으로인해일어난다는것을확인한다.그리고supervisorScope나SupervisorJob을사용해예외가전파될수있는범위를제한하는방법에대해다룬다.추가로trycatch문또는CoroutineExceptionHandler를사용해전파된예외를처리하는방법에대해서도설명한다.
9장에서는일시중단함수에대해다룬다.일시중단함수가재사용이가능한코드블록임을이해하고,일시중단함수를사용할때주의할점에대해알아본다.이후에
는일시중단함수를호출할수있는지점에대해알아보고,일시중단함수내부에서구조화를깨지않는CoroutineScope를생성해새로운자식코루틴을실행하는방법에대해서도살펴본다.
10장에서는앞서다룬내용을바탕으로코루틴에대한이해를더욱깊게만드는주제들을다룬다.서브루틴과코루틴의차이를알아보고,코루틴이협력적으로동작하는데스레드를양보하는것이왜중요하고코루틴이일시중단후재개될때어떤일이일어나는지살펴본다.
11장에서는코루틴의심화주제들을알아본다.멀티스레드환경에서공유상태를사용하는복수의코루틴이있을때의데이터동기화문제,CoroutineStart옵션을통해코루틴의실행방법을바꾸는방법,무제한디스패처가동작하는방식,코루틴의일시중단과재개가일어나는원리에대해설명한다.
12장에서는코루틴단위테스트에대해다룬다.코루틴테스트라이브러리를사용하는방법과코루틴단위테스트를어떻게진행하면좋을지에대해알아본다.