본문 바로가기
Android/Flow

[Android] Flow 결합 연산자: zip과 combine 차이

by 태크민 2025. 4. 29.

코틀린 Flow를 다루다 보면 여러 Flow를 하나로 결합해야 하는 경우가 자주 발생합니다.
이때 사용할 수 있는 대표적인 연산자가 바로 zip과 combine입니다.
이번 글에서는 zip과 combine이 어떻게 다른지, 코드 예시와 함께 자세히 알아보겠습니다.

 


zip

zip은 두 Flow에서 각각 하나씩 값을 받아 쌍(Pair)을 만들어 새로운 Flow를 생성합니다.
즉, 하나의 값이 발행되면 다른 Flow의 값이 발행될 때까지 기다린 후 결합하는 특징을 갖습니다.

또한, 한쪽 Flow가 완료되면 결과 Flow도 즉시 완료되고, 나머지 Flow는 취소됩니다.

 

마블 다이어그램을 살펴보면,
첫번째 flow에서는 숫자 1, 2, 3을 방출하고 있고, 두번째 flow에서는 문자 "A", "B", "C", "D"를 방출하고 있습니다.
두 flow를 zip 연산자를 통해 결합하면 1A, 2B, 3C 가 나오게 됩니다.

 

예시 코드

val numberFlow = flowOf(1, 2, 3).onEach { delay(10) }
val letterFlow = flowOf("a", "b", "c", "d").onEach { delay(15) }
numberFlow.zip(letterFlow) { i, s -> i.toString() + s }.collect {
    println(it)
}

출력 결과

1a
2b
3c

설명

  • 1과 a가 방출되어 결합 → 1a
  • 2는 b가 나올 때까지 기다린 뒤 결합 → 2b
  • 3도 c가 나올 때까지 기다려 결합 → 3c
  • 이후 numberFlow가 완료되면서 결과 Flow도 즉시 완료됩니다.
  • letterFlow의 남은 "d"는 버려지고 방출되지 않습니다.

zip 요약

  • 두 Flow의 값을 1:1로 묶어 새로운 Flow를 생성.
  • 하나의 값이 발행되면 다른 Flow의 값이 발행될 때까지 기다림
  • 한쪽 Flow가 완료되면 결과 Flow도 완료되며, 남은 Flow는 취소


combine

combine은 한쪽 Flow에서 새로운 값이 발행될 때마다 다른 쪽 Flow의 최신값과 결합하여 새로운 값을 방출합니다.
따라서, 모든 변화가 반영되며, 두 Flow가 모두 종료될 때까지 계속 값을 방출합니다.

 

앞의 예시와 동일하게 문자와 숫자가 발행되는 flow가 있습니다.
zip과 동일하게 두 flow의 값을 결합하여 변환한 후 그 결과를 보냅니다.
그런데 combine 연산자로 결합했더니 zip보다 훨씬 많은 값들이 방출되는 것을 확인할 수 있습니다.

 

예시 코드

val numberFlow = flowOf(1, 2, 3).onEach { delay(10) }
val letterFlow = flowOf("a", "b", "c", "d").onEach { delay(15) }
numberFlow.combine(letterFlow) { i, s -> i.toString() + s }.collect {
    println(it) 
}

출력 결과

1a
2a
2b
3b
3c
4c
4d

설명

  • 1과 a가 방출되어 결합 → 1a
  • 2가 방출되면 letterFlow의 최신값 a와 결합 → 2a
  • b가 방출되면 numberFlow의 최신값 2와 결합 → 2b
  • 3이 방출되면 letterFlow의 최신값 b와 결합 → 3b
  • 이후 letterFlow가 새 값 c를 방출하면 numberFlow 최신값 3과 결합 → 3c
  • 이런 방식으로 양쪽 Flow가 모두 완료될 때까지 계속 결합하여 방출합니다.

combine 요약

  • 각각의 Flow가 최신값을 유지하고, 한쪽이 발행되면 다른 쪽 최신값과 결합해 새로운 값을 생성
  • 두 Flow가 모두 종료될 때까지 계속 값을 방출
  • 모든 변경사항을 실시간으로 반영


정리

구분 zip combine
결합 시점 두 Flow 모두 값이 발행될 때 한 Flow의 값이 변경될 때마다
결합 방식 1:1로 짝지음 가장 최근 값과 결합
완료 시점 한 Flow가 끝나면 즉시 완료 두 Flow 모두 끝날 때까지 유지
특징 쌍을 맞춰서 출력 모든 변화를 다 반영하여 출력

zip과 combine 모두 Flow를 결합하는 데 사용되지만, 동작 방식과 쓰임새가 다릅니다.

  • 1:1 매칭이 필요한 경우에는 zip
  • 모든 값의 변화를 반영하고 싶은 경우에는 combine

상황에 따라 알맞은 연산자를 선택해서 사용하면 훨씬 더 깔끔하고 의도에 맞는 Flow 조합을 만들 수 있습니다.

 

 

끝.


참고자료

https://velog.io/@sana/KotlinFlow-Flow-%EA%B2%B0%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90-zip-combine

 

[Kotlin][Flow] Flow 결합 연산자 zip, combine

코틀린 flow에는 여러 개의 flow를 하나로 결합시키는 연산자들이 있다. 이 글에서는 그 중 zip과 combine에 대해 알아보도록 하겠다.

velog.io