Kt.Academy Kotlin Coroutines Deep Dive Summary 7부 — Flow Operator
본 게시글은 Kt.Academy의 Kotlin Coroutines DEEP DIVE의 요약본입니다.
목차
- 코루틴 원리 및 빌더
- 코루틴 컨텍스트 및 취소
- 코루틴 예외 처리 및 스코프 함수
- 코루틴 디스패처 및 스코프 함수
- 코루틴 테스트
- Flow 빌더 및 기본 Operator
- Flow Operator — 현재 게시글
Flow 결합 Operator
merge
2개 이상의 Flow
를 하나의 Flow
로 결합시키기 위한 Operator입니다.
zip
2개 이상의 Flow
를 하나의 Flow
로 결합시킵니다. merge()
와의 차이점은 merge()
는 각 Flow
의 방출이 독립적이라고 하면, zip()
은 각 Flow
의 방출을 하나의 쌍으로 방출합니다.
그렇기 때문에 두개 이상의 Flow
가 모두 값을 방출 했을 때, 방출됩니다. 또한, 하나의 Flow
가 종료되면 다 같이 종료됩니다.
combine
zip()
과 유사하게 각 Flow
가 방출한 값을 묶습니다. 하지만 큰 차이점은 새로운 방출값과 직전 방출값 을 묶어서 방출합니다.
Flow 변환 Operator
fold
fold()
는 문자, 숫자 값 등을 누적 처리 하기 위한 Operator입니다. fold()
을 이용하여 누적합, 누적값, 팩토리얼 연산 등을 간단하게 처리 할 수 있습니다.
Kotlin Collection 함수에서도 동일한 개념으로 제공하고 있습니다.
Flow
의 fold()
는 collect()
와 같은 Flow
를 실행 시키는 터미널 operator입니다.
그래서 선언과 동시에 Flow
를 실행 시킵니다.
문자, 숫자 값 등을 누적 처리 하기 위한 또 다른 방법으론 scan()
이 있습니다.
scan
fold()
는 누적 처리 + Flow 실행을 갖고 있습니다. scan()
은 값을 누적 처리 하기 만을 위해 사용합니다.
scan()
구현 내용을 확인하면 보다 더 이해가 쉬울 것입니다.
scan() 응용 하기
scan()
은 suspend
block에 직전값과 현재값을 전달합니다.
이 속성을 이용해서 방출되는 데이터를 하나의 리스트로 관리 시킬 수 있습니다.
FlatMap 시리즈
flatMap은 아주 잘 알려진 Operator입니다. flatMap이란 이름에서 알 수 있듯이 고차원을 저차원으로 평평하게 펴주기 위한 Operator입니다.
컬렉션 함수 flatMap()
은 3차원 배열을 2차원으로, 2차원 배열을 1차원으로 펼쳐줄 수 있습니다.
Flow속 flatMapConcat()
, flatMapMerge()
, flatMapLatest()
역시, 각각의 동작의 차이는 있지만 차원을 펴주기 위해서 사용합니다.
flatMapConcat
Rxjava
의 concatMap()
과 동일합니다. 상위 스트림에서 방출된 값을 기준으로 flatMapConcat()
을 하면 모든 것이 순차적으로 처리됩니다.
flatMapConcat()
은 생성한 Flow
가 완료될 때 까지, 상위 스트림이 방출한 값을 실행 하지 않습니다. 그렇기 때문에 방출 순서 보장이 필요한 경우에 사용합니다.
flatMapMerge
Rxjava
의 flatMap()
과 동일합니다. 상위 스트림이 값을 방출하는데로 flow를 병렬 실행 합니다.
그렇기 때문에 순서가 보장되지 않습니다.
또한 병렬 실행 갯수를 조절할 수 있습니다. (기본 값 16)
flatMapLatest
Rxjava
의 switchMap()
과 동일합니다. flatMapLatest()
가 생성한 Flow
가 완료되기 전에 상위 스트림에서 새로운 값이 방출되면 현재 작업중인 것을 취소합니다.
계속 상위 스트림에서 새로운 값을 방출 하니깐 계속 취소, 취소하다 결국 마지막 C 값에 대해서만 flatMapLatest()
가 완료 된 것을 확인 할 수 있습니다.