Kotlin에서 Flow
는 비동기적인 스트림을 처리하기 위한 새로운 개념입니다. Flow
는 비동기 연산을 수행하고 그 연산의 결과를 여러 개로 나눠서 반환할 수 있습니다.
Flow의 기본 개념
일반적으로 비동기 연산은 suspend
키워드를 사용하여 일시 중단되고 결과가 단일 값으로 반환됩니다. 그러나 Flow
를 사용하면 연속적인 값의 스트림을 반환할 수 있습니다.
예를 들어, 다음과 같이 Flow
를 정의하고 사용할 수 있습니다.
fun simpleFlow(): Flow<Int> = flow {
for (i in 1..5) {
delay(100)
emit(i)
}
}
fun main() = runBlocking {
simpleFlow().collect { value ->
println(value)
}
}
위 코드에서 simpleFlow
함수는 1부터 5까지의 값을 100ms 간격으로 방출하는 Flow
를 정의하고 있습니다. collect
함수를 사용하여 Flow
의 값을 수집하고 출력합니다.
Flow의 연산
Flow
를 사용하면 여러 다양한 연산을 수행할 수 있습니다. 예를 들어, map
, filter
, transform
, zip
등의 연산자를 사용하여 Flow
의 값을 변환하고 조작할 수 있습니다.
fun main() = runBlocking {
simpleFlow()
.map { value -> value * 2 }
.filter { value -> value > 5 }
.collect { value ->
println(value)
}
}
위 코드에서는 map
함수로 각 값을 2배로 변환하고, filter
함수로 값이 5보다 큰 경우만 출력합니다.
Flow의 에러 처리
Flow
는 연산 중 발생하는 에러를 처리할 수 있는 메커니즘을 제공합니다. try/catch
블록이나 catch
연산자를 사용하여 에러를 처리할 수 있습니다.
fun errorHandlerFlow(): Flow<String> = flow {
for (i in 1..3) {
delay(100)
emit("Emitting $i")
}
throw RuntimeException("Something went wrong")
}
fun main() = runBlocking {
errorHandlerFlow()
.catch { e -> emit("Caught: $e") }
.collect { value ->
println(value)
}
}
위 코드에서 catch
연산자를 사용하여 에러를 처리하고, 처리된 결과를 출력합니다.
결론
Kotlin의 Flow
는 비동기적인 처리를 위한 강력한 도구입니다. Flow
를 사용하면 순차적인 데이터 스트림을 처리하고 조작할 수 있으며, 에러 처리 또한 효과적으로 수행할 수 있습니다.
더 많은 정보는 공식 Kotlin Flow 문서를 참고하세요.