본문 바로가기

안드로이드

[Android] - 데이터 스트림을 다루는 방법 코루틴 Flow!

이번 포스팅에서는 안드로이드에서 비동기 데이터 스트림을 효과적으로 관리할 수 있는 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 상태 관리나 여러 구독자에게 데이터 전달도 효과적으로 처리할 수 있습니다.