
Kotlin in Action 2/e [코틀린 컴파일러 개발자가 직접 알려주는 코틀린 언어 핵심 (코루틴과 플로우 포함 코틀린 2 대응)]
- 원서명Kotlin in Action, Second Edition (ISBN 9781617299605)
- 지은이세바스티안 아이그너(Sebastian Aigner), 로만 엘리자로프(Roman Elizarov), 스베트라나 이사코바(Svetlana Isakova), 드미트리 제메로프(Dmitry Jemerov)
- 옮긴이오현석
- ISBN : 9791161759692
- 48,000원
- 2025년 02월 27일 펴냄
- 페이퍼백 | 804쪽 | 188*235mm
- 시리즈 : 모바일 프로그래밍
책 소개
요약
안드로이드 공식 언어인 코틀린은 실용성과 간결성, 자바와의 상호 운용성으로 인해 서버 프로그래밍 등 다양한 분야에 쓰이는 경우가 늘고 있다. 코틀린 언어의 가장 큰 특징이라면 실용성을 들 수 있을 것이다. 이 책도 실용성을 강조하는 입장에서 쓰였으며, 코틀린 언어를 개발한 젯브레인즈의 코틀린 컴파일러 개발자들이 직접 쓴 일종의 공식 서적이라 할 수 있다. 2017년 초판이 나온 이래 사실상 코틀린 참고서로 자리잡은 이 책은, 코틀린 2.0에 맞춰 변경한 2판이다.
이 책은 코틀린 기초를 소개하고, 객체지향, 제네릭스, 고차 함수와 함수형 프로그래밍, 표준 컬렉션 라이브러리 활용 등의 내용을 설명한다. 이때 코틀린이 자바 언어를 어떻게 개선했고 기존 자바 프로젝트에서 코틀린을 함께 사용할 때 어떤 부분을 조심해야 할지를 함께 자세히 설명한다. 후반부는 애노테이션과 리플렉션, DSL, 비동기(일시 중단 함수와 코루틴, 플로우) 프로그래밍에 대해 실제 라이브러리 예제를 다루면서 설계 기법과 구현기법을 자세히 설명한다.
이 책에서 다루는 내용
◆ 코틀린 팀 멤버들의 가이드
◆ 도메인 특화 언어(DSL)
◆ 코틀린 코루틴과 플로우
이 책의 대상 독자
주로 어느 정도 자바 경험이 있는 개발자를 대상으로 한 책이다. 코틀린은 자바에 있는 여러 개념과 기법 위에 만들어졌고, 이 책은 독자가 코틀린을 빠르게 배울 수 있도록 독자들의 기존 지식을 활용한다.
C#이나 자바 스크립트 같은 다른 프로그래밍 언어에 대한 경험이 있는 독자라면 코틀린과 JVM의 상호작용의 복잡한 측면을 이해하기 위해 다른 자료가 필요하겠지만 여전히 이 책을 사용해 코틀린을 배울 수 있다. 이 책은 코틀린 언어 전체를 다루며, 특별히 구체적인 문제 영역에 초점을 맞추지는 않는다. 따라서 서버 개발자나 안드로이드 개발자나 JVM에서 실행될 프로젝트를 구축하는 모든 개발자에게 도움이 될 것이다.
목차
목차
- 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.2 when으로 이넘 클래스 다루기
- 2.3.3 when식의 대상을 변수에 포획
- 2.3.4 when의 분기 조건에 임의의 객체 사용
- 2.3.5 인자 없는 when 사용
- 2.3.6 스마트 캐스트: 타입 검사와 타입 캐스트 조합
- 2.3.7 리팩터링: if를 when으로 변경
- 2.3.8 if와 when의 분기에서 블록 사용
- 2.4 대상 이터레이션: while과 for 루프
- 2.4.1 조건이 참인 동안 코드 반복: while 루프
- 2.4.2 수에 대해 이터레이션: 범위와 순열
- 2.4.3 맵에 대해 이터레이션
- 2.4.4 in으로 컬렉션이나 범위의 원소 검사
- 2.5 코틀린에서 예외 던지고 잡아내기
- 2.5.1 try, catch, finally를 사용한 예외 처리와 오류 복구
- 2.5.2 try를 식으로 사용
- 요약
- 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.2 open, 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.4 object 키워드: 클래스 선언과 인스턴스 생성을 한꺼번에 하기
- 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.2 SAM 변환: 람다를 함수형 인터페이스로 명시적 변환
- 5.3 코틀린에서 SAM 인터페이스 정의: fun interface
- 5.4 수신 객체 지정 람다: with, apply,also
- 5.4.1 with 함수
- 5.4.2 apply 함수
- 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.1 NullPointerException을 피하고 값이 없는 경우 처리: 널 가능성
- 7.2 널이 될 수 있는 타입으로 널이 될 수 있는 변수 명시
- 7.3 타입의 의미 자세히 살펴보기
- 7.4 안전한 호출 연산자로 null 검사와 메서드 호출 합치기: ?.
- 7.5 엘비스 연산자로 null에 대한 기본값 제공: ?:
- 7.6 예외를 발생시키지 않고 안전하게 타입을 캐스트하기: as?
- 7.7 널 아님 단언: !!
- 7.8 let 함수
- 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.5 Any와 Any?: 코틀린 타입 계층의 뿌리
- 8.1.6 Unit 타입: 코틀린의 void
- 8.1.7 Nothing 타입: 이 함수는 결코 반환되지 않는다
- 8.2 컬렉션과 배열
- 8.2.1 널에 될 수 있는 값의 컬렉션과 널이 될 수 있는 컬렉션
- 8.2.2 읽기 전용과 변경 가능한 컬렉션
- 8.2.3 코틀린 컬렉션과 자바 컬렉션은 밀접히 연관됨
- 8.2.4 자바에서 선언한 컬렉션은 코틀린에서 플랫폼 타입으로 보임
- 8.2.5 성능과 상호운용을 위해 객체의 배열이나 원시 타입의 배열을 만들기
- 요약
- 2부 코틀린을 코틀린답게 사용하기
- 9장 연산자 오버로딩과 다른 관례
- 9.1 산술 연산자를 오버로드해서 임의의 클래스에 대한 연산을 더 편리하게 만들기
- 9.1.1 plus, 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.4 component 함수를 사용해 구조 분해 선언 제공
- 9.4.1 구조 분해 선언과 루프
- 9.4.2 _ 문자를 사용해 구조 분해 값 무시
- 9.5 프로퍼티 접근자 로직 재활용: 위임 프로퍼티
- 9.5.1 위임 프로퍼티의 기본 문법과 내부 동작
- 9.5.2 위임 프로퍼티 사용: by lazy()를 사용한 지연 초기화
- 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.2.4 언제 함수를 인라인으로 선언할지 결정
- 10.2.5 withLock, use, useLines로 자원 관리를 위해 인라인된 람다 사용
- 10.3 람다에서 반환: 고차 함수에서 흐름 제어
- 10.3.1 람다 안의 return 문: 람다를 둘러싼 함수에서 반환
- 10.3.2 람다로부터 반환: 레이블을 사용한 return
- 10.3.3 익명 함수: 기본적으로 로컬 return
- 요약
- 11장 제네릭스
- 11.1 타입 인자를 받는 타입 만들기: 제네릭 타입 파라미터
- 11.1.1 제네릭 타입과 함께 동작하는 함수와 프로퍼티
- 11.1.2 제네릭 클래스를 각괄호 구문을 사용해 선언한다
- 11.1.3 제네릭 클래스나 함수가 사용할 수 있는 타입 제한: 타입 파라미터 제
- 약
- 11.1.4 명시적으로 타입 파라미터를 널이 될 수 없는 타입으로 표시해서 널이 될 수 있는 타입 인자 제외시키기
- 11.2 실행 시점 제네릭스 동작: 소거된 타입 파라미터와 실체화된 타입 파라미터
- 11.2.1 실행 시점에 제네릭 클래스의 타입 정보를 찾을 때 한계: 타입 검사와
- 캐스팅
- 11.2.2 실체화된 타입 파라미터를 사용하는 함수는 타입 인자를 실행 시점에
- 언급할 수 있다
- 11.2.3 클래스 참조를 실체화된 타입 파라미터로 대신함으로써 java.lang.Class
- 파라미터 피하기
- 11.2.4 실체화된 타입 파라미터가 있는 접근자 정의
- 11.2.5 실체화된 타입 파라미터의 제약
- 11.3 변성은 제네릭과 타입 인자 사이의 하위 타입 관계를 기술
- 11.3.1 변성은 인자를 함수에 넘겨도 안전한지 판단하게 해준다
- 11.3.2 클래스, 타입, 하위 타입
- 11.3.3 공변성은 하위 타입 관계를 유지한다
- 11.3.4 반공변성은 하위 타입 관계를 뒤집는다
- 11.3.5 사용 지점 변성을 사용해 타입이 언급되는 지점에서 변성 지정
- 11.3.6 스타 프로젝션: 제네릭 타입 인자에 대한 정보가 없음을 표현하고자 * 사용
- 11.3.7 타입 별명
- 요약
- 12장 어노테이션과 리플렉션
- 12.1 어노테이션 선언과 적용
- 12.1.1 어노테이션을 적용해 선언에 표지 남기기
- 12.1.2 어노테이션이 참조할 수 있는 정확한 선언 지정: 어노테이션 타깃
- 12.1.3 어노테이션을 활용해 JSON 직렬화 제어
- 12.1.4 어노테이션 선언
- 12.1.5 메타어노테이션: 어노테이션을 처리하는 방법 제어
- 12.1.6 어노테이션 파라미터로 클래스 사용
- 12.1.7 어노테이션 파라미터로 제네릭 클래스 받기
- 12.2 리플렉션: 실행 시점에 코틀린 객체 내부 관찰
- 12.2.1 코틀린 리플렉션 API: KClass, KCallable, KFunction, KProperty
- 12.2.2 리플렉션을 사용해 객체 직렬화 구현
- 12,2,3 어노테이션을 활용해 직렬화 제어
- 12.2.4 JSON 파싱과 객체 역직렬화
- 12.2.5 최종 역직렬화 단계: callBy()와 리플렉션을 사용해 객체 만들기
- 요약
- 13장 DSL 만들기
- 13.1 API에서 DSL로: 표현력이 좋은 커스텀 코드 구조 만들기
- 13.1.1 영역 특화 언어
- 13.1.2 내부 DSL은 프로그램의 나머지 부분과 매끄럽게 통합된다
- 13.1.3 DSL의 구조
- 13.1.4 내부 DSL로 HTML 만들기
- 13.2 구조화된 API 구축: DSL에서 수신 객체 지정 람다 사용
- 13.2.1 수신 객체 지정 람다와 확장 함수 타입
- 13.2.2 수신 객체 지정 람다를 HTML 빌더 안에서 사용
- 13.2.3 코틀린 빌더: 추상화와 재사용을 가능하게 해준다
- 13.3 invoke 관례를 사용해 더 유연하게 블록 내포시키기
- 13.3.1 invoke 관례를 사용해 더 유연하게 블록 내포시키기
- 13.3.2 DSL의 invoke 관례: 그레이들 의존관계 선언
- 13.4 실전 코틀린 DSL
- 13.4.1 중위 호출 연쇄시키기: 테스트 프레임워크의 should 함수
- 13.4.2 원시 타입에 대해 확장 함수 정의하기: 날짜 처리
- 13.4.3 멤버 확장 함수: SQL을 위한 내부 DSL
- 요약
- 3부 코루틴과 플로우를 활용한 동시성 프로그래밍
- 14장 코루틴
- 14.1 동시성과 병렬성
- 14.2 코틀린의 동시성 처리 방법: 일시 중단 함수와 코루틴
- 14.3 스레드와 코루틴 비교
- 14.4 잠시 멈출 수 있는 함수: 일시 중단 함수
- 14.4.1 일시 중단 함수를 사용한 코드는 순차적으로 보인다
- 14.5 코루틴을 다른 접근 방법과 비교
- 14.5.1 일시 중단 함수 호출
- 14.6 코루틴의 세계로 들어가기: 코루틴 빌더
- 14.6.1 일반 코드에서 코루틴의 세계로: runBlocking 함수
- 14.6.2 발사 후 망각 코루틴 생성: launch 함수
- 14.6.3 대기 가능한 연산: async 빌더
- 14.7 어디서 코드를 실행할지 정하기: 디스패처
- 14.7.1 디스패처 선택
- 14.7.2 코루틴 빌더에 디스패처 전달
- 14.7.3 withContext를 사용해 코루틴 안에서 디스패처 바꾸기
- 14.7.4 코루틴과 디스패처는 스레드 안전성 문제에 대한 마법 같은 해결책이
- 아니다
- 14.8 코루틴은 코루틴 콘텍스트에 추가적인 정보를 담고 있다
- 요약
- 15장 구조화된 동시성
- 15.1 코루틴 스코프가 코루틴 간의 구조를 확립한다
- 15.1.1 코루틴 스코프 생성: coroutineScope 함수
- 15.1.2 코루틴 스코프를 컴포넌트와 연관시키기: CoroutineScope
- 15.1.3 GlobalScope의 위험성
- 15.1.4 코루틴 콘텍스트와 구조화된 동시성
- 15.2 취소
- 15.2.1 취소 촉발
- 15.2.2 시간제한이 초과된 후 자동으로 취소 호출
- 15.2.3 취소는 모든 자식 코루틴에게 전파된다
- 15.2.4 취소된 코루틴은 특별한 지점에서 CancellationException을 던진다
- 15.2.5 취소는 협력적이다
- 15.2.6 코루틴이 취소됐는지 확인
- 15.2.7 다른 코루틴에게 기회를 주기: yield 함수
- 15.2.8 리소스를 얻을 때 취소를 염두에 두기
- 15.2.9 프레임워크가 여러분 대신 취소를 할 수 있다
- 요약
- 16장 플로우
- 16.1 플로우는 연속적인 값의 스트림을 모델링한다
- 16.1.1 플로우를 사용하면 배출되자마자 원소를 처리할 수 있다
- 16.1.2 코틀린 플로우의 여러 유형
- 16.2 콜드 플로우
- 16.2.1 flow 빌더 함수를 사용해 콜드 플로우 생성
- 16.2.2 콜드 플로우는 수집되기 전까지 작업을 수행하지 않는다
- 16.2.3 플로우 수집 취소
- 16.2.4 콜드 플로우의 내부 구현
- 16.2.5 채널 플로우를 사용한 동시성 플로우
- 16.3 핫 플로우
- 16.3.1 공유 플로우는 값을 구독자에게 브로드캐스트한다
- 16.3.2 시스템 상태 추적: 상태 플로우
- 16.3.3 상태 플로우와 공유 플로우의 비교
- 16.3.4 핫 플로우, 콜드 플로우, 공유 플로우, 상태 플로우: 언제 어떤 플로우를 사용할까?
- 요약
- 17장 플로우 연산자
- 17.1 플로우 연산자로 플로우 조작
- 17.2 중간 연산자는 업스트림 플로우에 적용되고 다운스트림 플로우를 반환한다
- 17.2.1 업스트림 원소별로 임의의 값을 배출: transform 함수
- 17.2.2 take나 관련 연산자는 플로우를 취소할 수 있다
- 17.2.3 플로우의 각 단계 후킹: onStart, onEach, onCompletion, onEmpty
- 17.2.4 다운스트림 연산자와 수집자를 위한 원소 버퍼링: buffer 연산자
- 17.2.5 중간값을 버리는 연산자: conflate 연산자
- 17.2.6 일정 시간 동안 값을 필터링하는 연산자: debounce 연산자
- 17.2.7 플로우가 실행되는 코루틴 콘텍스트를 바꾸기: flowOn 연산자
- 17.3 커스텀 중간 연산자 만들기
- 17.4 최종 연산자는 업스트림 플로우를 실행하고 값을 계산한다
- 17.4.1 프레임워크는 커스텀 연산자를 제공한다
- 요약
- 18장 오류 처리와 테스트
- 18.1 코루틴 내부에서 던져진 오류 처리
- 18.2 코틀린 코루틴에서의 오류 전파
- 18.2.1 자식이 실패하면 모든 자식을 취소하는 코루틴
- 18.2.2 구조적 동시성은 코루틴 스코프를 넘는 예외에만 영향을 미친다
- 18.2.3 슈퍼바이저는 부모와 형제가 취소되지 않게 한다
- 18.3 CoroutineExceptionHandler: 예외 처리를 위한 마지막 수단
- 18.3.1 CoroutineExceptionHandler를 launch와 async에 적용할 때의 차이점
- 18.4 플로우에서 예외 처리
- 18.4.1 catch 연산자로 업스트림 예외 처리
- 18.4.2 술어가 참일 때 플로우의 수집 재시도: retry 연산자
- 18.5 코루틴과 플로우 테스트
- 18.5.1 코루틴을 사용하는 테스트를 빠르게 만들기: 가상 시간과 테스트 디스패처
- 18.5.2 터빈으로 플로우 테스트
- 요약
- 부록 A 코틀린 프로젝트 빌드
- 부록 B 코틀린 코드 문서화
- 부록 C 코틀린 생태계