오늘은 안드로이드 개발에서 비동기 작업과 데이터 스트림을 효율적으로 관리하기 위한 Flow에 대해 알아보겠다. Flow는 데이터 스트림을 처리하고, 비동기 작업을 간결하게 관리할 수 있도록 돕는 Kotlin의 강력한 도구이다.
Flow
Flow는 비동기적으로 동작하는 데이터 스트림으로, 순차적으로 값을 방출하고 정상적으로 완료하거나 예외와 함께 종료된다.
Flow의 구조

최종 연산자: 값을 소비하는 유일한 방법, Flow의 데이터를 최종적으로 소비하는 중요한 역할
예를 들어: collect: 데이터를 최종적으로 수집(consume).
flowOf(1, 2, 3).collect { value -> println(value) }
중간 연산자: Flow의 데이터 스트림을 여러 단계에 걸쳐 조작할 수 있는 API 제공
예:
- map: 데이터를 변환.
- filter: 특정 조건을 만족하는 데이터만 방출.
- suspend 함수 호출 가능
- 다양한 연산자들과 결합해 복잡한 데이터를 간결하고 효율적으로 처리
flow { emit("Hello")} // 생산자
.onEach { println(it)} // 중간 연산자
.onStart { println("Do something before")}
// 중간 연산자
.onCompletion { println("Do something after")}
// 중간 연산자
.catch { emit("Error")} // 중간 연산자
.collect{ println("Collected : $it")} // 최종 연산자
Hot Stream🔥 VS Cold Stream🥶
flow는 두가지 형태 Hot Stream과 Cold Stream으로 나누어 진다.
Hot Stream🔥: 데이터를 소비하는 것과 무관하게 작업 수행 소비자가 구독하기 전에 이미 데이터 생산 시작 데이터 요청 시 최신 데이터 수신한다.
예시: StateFlow, SharedFlow
Cold Stream🥶: 데이터 요청이 있을 때만 작업 수행 소비자가 구독할 때 데이터 생산 시작 각각 독립적인 데이터 제공한다.
예시: 기본 Flow, RxJava Observable.

Flow는 Flow가 생성되는 부분이 아니라 Flow가 소비되는 부분에서 출력
소비자가 collect로 데이터를 수집하기 전까지는 데이터를 생산하지 않는다.
Flow 사용 시 주요 개념
지연 평가 (Lazy Evaluation)
- Flow는 소비자가 데이터를 요청하기 전까지 어떤 작업도 실행하지 않습니다.
- collect 함수 호출 시 데이터 스트림이 시작됩니다.
비동기 처리와 구조적 동시성
- Flow는 코루틴과 결합해 비동기 작업을 효율적으로 관리합니다.
- 수집(collect)이 진행 중인 코루틴이 취소되면 Flow도 정리됩니다.
Flow의 기본 사용법
Flow 선언
val flow = flow {
emit(1) // 데이터 방출
emit(2)
emit(3)
}
중간 연산자 추가
flow
.onStart { println("시작") }
.filter { it % 2 != 0 }
.map { it * 10 }
.onCompletion { println("완료") }
.collect { println(it) }
에러처리
flow
.catch { emit(-1) } // 에러 발생 시 -1 방출
.collect { println(it) }
Flow의 한계와 주의점
- Cold Stream의 특성: 구독 전 데이터가 생산되지 않으므로 일부 상황에서는 적합하지 않을 수 있음.
- Hot Stream의 리소스 관리: 지속적으로 실행되는 스트림은 메모리 누수에 주의해야 함.
결론
Flow는 비동기 작업과 데이터 스트림 관리의 복잡성을 줄이면서 선언적인 방식으로 코드를 작성할 수 있게 도와준다. StateFlow와 SharedFlow 같은 확장 기능으로 더욱 강력한 데이터 흐름 제어가 가능하다.
'android' 카테고리의 다른 글
| Android Kotlin (0) | 2025.02.01 |
|---|---|
| Android MVVM (1) | 2024.12.30 |
| Android MVP (2) | 2024.12.24 |
| Android Modifier (0) | 2024.12.02 |
| Android Navigation? (0) | 2024.11.26 |