[kotlin] Flow 개념 이해하기

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 문서를 참고하세요.