본문 바로가기
Android/Kotlin

Kotlin (코틀린) Coroutine의 Flow 결합 방법

by 2Plus 2020. 6. 8.

Photo by Mike Lewis HeadSmart Media on Unsplash

 Kotlin(코틀린)의 Coroutine(코루틴)에는 Flow라는 것이 있다. Flow를 잘 모른다면 일단 RxKotlin에서의 Observable과 유사하다고 생각하면 된다. 이번 포스팅에서는 이러한 Flow들을 결합해서 사용하는 방법에 대해 정리할 예정이다.

 Coroutine은 Flow를 결합하기 위해 combine(결합), zip(압축), flattenMerge의 세 가지 연산자를 제공해준다. 이 세 가지에 대해 각각 알아보자.

 

반응형

 

결합 (Combine) 연산자

 

 

 먼저 combine 연산자에 대해서 살펴보자. Flow의 extension 함수인데  결합을 위해 다른 Flow를 인자로 받는다. 두 번째 인자로는 람다 suspend 함수를 받는데, 두 Flow (기존 Flow와 인자로 준 Flow)에서 emit 된 값 두 개를 받는 람다 식이다. 이 람다식을 통해서 변형을 수행할 수 있다.

 설명만 보고는 잘 이해하지 못 할 수도 있으니, 간단한 예시를 확인 해 보자.

 

 

 

 위와 같이 두 개의 Flow가 있다고 할 때, 하나는 10ms마다 1, 2, 3을 방출하고 다른 하나는 20ms마다 A, B, C를 방출한다. 이러한 두 개의 Flow를 결합해서 하나의 결과를 만들고 싶을 때 combine을 사용하면 된다.

 

 

 

 앞서 combine의 원형에서 살펴본 대로, intFlow의 인자로 charFlow를 전달하고, 람다 식도 작성해주었다. 람다 식의 첫 번째 인자로는 intFlow의 방출 값이, 두 번째 인자로는 charFlow의 방출 값이 전달된다. 이를 이용하여 람다식 안에서 값을 가지고 원하는 처리를 진행할 수 있다. 이 예시에서는 간단하게 하나로 합친 문자열을 반환하도록 하였다. collect 연산자를 통해 출력하도록 했다.

 그런데 여기서 한 가지 생각해 볼 점이 있다. intFlow는 10ms 간격으로 방출되고, charFlow는 20ms 간격으로 방출되는데 이렇게 주기가 다른 Flow를 결합한다면 값이 어떻게 출력될까?

 

 

 

 위와 같이 두 Flow 중에 하나에서 값이 방출되면 두 Flow에서 방출된 최신 값들만 가지고 람다 식이 호출된다.

 

 위의 그림과 같이 한 Flow에서 방출이 일어날 때 두 Flow에서 최신 방출 값을 가져오도록 진행이 되는 것이다.

 

 

Zip 연산자

 

 

 이번에는 zip 연산자에 대해 살펴본다. 마찬가지로 Flow의 extension 함수이다. 인자로 받는 부분까지는 앞에서 살펴 본 combine과 크게 다를 것이 없어 보인다. combine과 다른 점은 두 Flow의 방출 값을 모아서 한 번에 방출한다는 점이다.

 

 

 

 앞에서 봤던 예시를 위한 Flow 두 개로 zip 연산을 사용해보자.

 

 

 

 앞의 예제에서 combine이 있던 자리에 zip이 있는 것을 빼고는 코드상으로 다를 것이 없다. 하지만 실제 동작되는 것은 다르다. 먼저 동작 결과를 보자.

 

 

 

 앞의 combine과는 결과가 다른 것을 알 수 있다. zip은 하나의 Flow에서 값이 방출되면 다른 Flow에서도 값이 방출될 때까지 기다렸다가, 다른 Flow에서도 값이 방출되면 그때 람다식을 호출하여 결과 값을 방출한다.

 

 

 

 

flattenMerge 연산자

 flattenMerge는 앞의 두 경우와는 조금 다르다. 두 개의 Flow를 합쳐서 처리 후 하나로 만드는 느낌이 아니라 두 방출 값을 하나의 결과 통로로 그대로 내보내는 느낌이다.

 

 

 

 앞의 두 경우는 Flow의 extension 함수였지만, flattenMerge는 Flow 배열의 확장 형태이다. 주어진 Flow들을 하나의 Flow로 만들어주기만 한다. collect가 호출되면 중첩된 flow들이 실행되는 구조이다.

 

 

 

 이해를 돕기 위해 이번에도 동일한 Flow 두 개를 사용하겠다.

 

 

 

 두 개의 Flow에서 방출되는 결과들이 flattenMerge를 통해 하나의 Flow 결과물로 값이 하나씩 그때그때 방출된다. 결과를 확인해보자.

 

 

 

 어떤 Flow에서 값이 방출되든 그때그때 바로 방출된다. 다른 방출 값과 관계도 없으며, 여러 개의 Flow들의 방출 값이 하나의 Flow의 방출로 그대로 나가는 것을 확인할 수 있다.

 

 

반응형

'Android > Kotlin' 카테고리의 다른 글

Kotlin Result 에러 핸들링  (134) 2021.11.07
Kotlin - Coroutine 추가 정리 3  (258) 2020.05.31
Kotlin - Coroutine 추가 정리 2  (355) 2020.05.29
Kotlin - Coroutine 추가 정리 1  (260) 2020.05.27
Kotlin : local, infix, inline functions, Operator Overloading  (613) 2020.05.25

댓글