Kt.Academy Kotlin Coroutines Deep Dive Summary 7부 — Flow Operator

GodDB
6 min readMar 28, 2022

--

본 게시글은 Kt.Academy의 Kotlin Coroutines DEEP DIVE의 요약본입니다.

목차

  1. 코루틴 원리 및 빌더
  2. 코루틴 컨텍스트 및 취소
  3. 코루틴 예외 처리 및 스코프 함수
  4. 코루틴 디스패처 및 스코프 함수
  5. 코루틴 테스트
  6. Flow 빌더 및 기본 Operator
  7. Flow Operator — 현재 게시글

Flow 결합 Operator

merge

merge — 출처 : https://kt.academy/article/cc-flow-combine

2개 이상의 Flow를 하나의 Flow로 결합시키기 위한 Operator입니다.

zip

zip — 출처 : https://kt.academy/article/cc-flow-combine

2개 이상의 Flow를 하나의 Flow로 결합시킵니다. merge()와의 차이점은 merge()는 각 Flow의 방출이 독립적이라고 하면, zip()은 각 Flow의 방출을 하나의 쌍으로 방출합니다.

그렇기 때문에 두개 이상의 Flow가 모두 값을 방출 했을 때, 방출됩니다. 또한, 하나의 Flow가 종료되면 다 같이 종료됩니다.

combine

zip()과 유사하게 각 Flow가 방출한 값을 묶습니다. 하지만 큰 차이점은 새로운 방출값과 직전 방출값 을 묶어서 방출합니다.

Flow 변환 Operator

fold

fold — https://kt.academy/article/cc-scan

fold()는 문자, 숫자 값 등을 누적 처리 하기 위한 Operator입니다. fold()을 이용하여 누적합, 누적값, 팩토리얼 연산 등을 간단하게 처리 할 수 있습니다.

Kotlin Collection 함수에서도 동일한 개념으로 제공하고 있습니다.

Flowfold()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

RxjavaconcatMap()과 동일합니다. 상위 스트림에서 방출된 값을 기준으로 flatMapConcat()을 하면 모든 것이 순차적으로 처리됩니다.

flatMapConcat()은 생성한 Flow가 완료될 때 까지, 상위 스트림이 방출한 값을 실행 하지 않습니다. 그렇기 때문에 방출 순서 보장이 필요한 경우에 사용합니다.

flatMapMerge

RxjavaflatMap() 과 동일합니다. 상위 스트림이 값을 방출하는데로 flow를 병렬 실행 합니다.

그렇기 때문에 순서가 보장되지 않습니다.

또한 병렬 실행 갯수를 조절할 수 있습니다. (기본 값 16)

flatMapLatest

RxjavaswitchMap()과 동일합니다. flatMapLatest()가 생성한 Flow가 완료되기 전에 상위 스트림에서 새로운 값이 방출되면 현재 작업중인 것을 취소합니다.

계속 상위 스트림에서 새로운 값을 방출 하니깐 계속 취소, 취소하다 결국 마지막 C 값에 대해서만 flatMapLatest()가 완료 된 것을 확인 할 수 있습니다.

참고자료

--

--