이번 포스팅에서는 안드로이드에서 비동기 데이터 스트림을 효과적으로 관리할 수 있는 Flow에 대해 다뤄보겠습니다.
1. Flow란?
Flow는 코루틴에서 제공하는 비동기 데이터 스트림을 다루는 기능입니다.
한 번에 하나의 값 밖에 반환하는 suspend 함수와 달리, Flow는 여러 개의 값을 순차적으로 방출할 수 있습니다.
- 여기서 비동기 데이터 스트림이란 시간이 지남에 따라 데이터를 연속적으로 전달하는 방식을 말합니다. 쉽게 말해 데이터를 한 번에 전달하는 게 아니라, 필요할 때마다 조금씩 흘려보내는 것을 말합니다.
2. Flow의 기본 사용법
Flow를 만들고 값을 방출하려면 flow {}를 사용합니다.
fun simpleFlow(): Flow<Int> = flow {
for (i in 1..5) {
delay(1000) // 1초마다 값을 방출
emit(i) // 데이터 방출
}
}
fun main() = runBlocking {
simpleFlow().collect { value ->
println(value) // Flow에서 방출된 값을 수집
}
}
위에 코드를 실행하면 1초 간격으로 숫자 출력됩니다.
3. Flow의 핵심 메서드
3.1 collect
Flow에서 데이터를 수집하려면 collect {}을 사용합니다.
simpleFlow().collect { value ->
println("받은 값: $value")
}
3.2 transform
Flow에서 transform함수를 사용하면 방출된 데이터를 가공할 수 있습니다
simpleFlow()
.transform { value ->
emit("값: $value")
}
.collect { println(it) }
3.3 filter & map
Flow에서 filter & map 함수를 사용하면 특정 데이터를 필터링하거나 변환할 수도 있습니다.
simpleFlow()
.filter { it % 2 == 0 } // 짝수만 필터링
.map { "짝수 값: $it" } // 값을 문자열로 변환
.collect { println(it) }
4. StateFlow와 SharedFlow
4.1 StateFlow
StateFlow는 현재 상태를 저장하고, 변경 시 최신 값을 즉시 제공하는 Flow입니다.
val _stateFlow = MutableStateFlow(0) // 초기값 0
val stateFlow: StateFlow<Int> = _stateFlow
scope.launch {
_stateFlow.value = 10 // 값 변경
}
4.2 SharedFlow
SharedFlow는 여러 구독자에게 데이터를 동시에 전달하는 Flow입니다.
val _sharedFlow = MutableSharedFlow<Int>()
val sharedFlow: SharedFlow<Int> = _sharedFlow
scope.launch {
_sharedFlow.emit(5) // 값 방출
}
4.3 StateFlow와 SharedFlow 차이점
속성 | StateFlow | SharedFlow |
초기값 | 필요 O | 필요 X |
최신 값 유지 | O | X |
새로운 구독자 | 즉시 최신 값 전달 | 이전 값 전달 X |
5. 정리
이번 포스팅에서는 Flow의 기본 개념과 활용법에 대해 알아보았습니다.
Flow를 사용하면 비동기 데이터 스트림을 더욱 쉽게 관리할 수 있으며, collect, filter, map 등 다양한 연산자를 활용할 수 있습니다. 또한 StateFlow, SharedFlow를 사용하면 UI 상태 관리나 여러 구독자에게 데이터 전달도 효과적으로 처리할 수 있습니다.
'안드로이드' 카테고리의 다른 글
[Android] - OkHttp VS Retrofit (0) | 2025.04.01 |
---|---|
[Android] - SSE로 실시간 통신하기! (0) | 2025.04.01 |
[Android] - 안드로이드 비동기! Coroutine! (0) | 2025.02.10 |
[Android] - 안드로이드 디자인 패턴 MVVM편 (7) | 2025.01.13 |
[Android] - 안드로이드 디자인 패턴 MVI편 (5) | 2025.01.07 |