Flow가 뭘까?

hyihyi·2024년 8월 7일
post-thumbnail

📖 Flow란?

코루틴으로 만들어진 비동기 스트림
스트림으로 변화를 추적할 수 있다.

📝 Flow 사용하기

1-1 Flow Builder

flow builder로 flow를 만들 수 있다.

1-2 주요 Flow Builder

1) flow

코드 블록으로 flow를 만들고 collect를 호출해야 값이 발생

fun flowSomething(): Flow<Int> = flow {
    repeat(10) {
        emit(it)
        delay(10L)
    }
}

fun main() = runBlocking {
    flowSomething().collect { value ->
        println(value)
    }
}
0
1
2
3
4
5
6
7
8
9

emit으로 임의의 정수를 10번 방출하는 Flow를 생성
flowSomething에서 방출된 데이터를 collect로 수집
수집된 데이터는 println을 통해 출력

emit은 Flow의 데이터를 "방출"하고, collect 블록에서 그 데이터를 받아와 println(value)를 통해 실제로 콘솔에 출력

🤔 flow만 써선 바로 출력 안되나?

flow는 콜드 스트림이다
➡ 요청(collect)이 있는 경우에 1:1로 값을 전달한다.

2) flowOf

여러 값을 인자로 전달해 플로우를 만든다.
flowOf는 emit을 자동으로 호출하는 역할을 하지만, collect가 호출되어야 데이터가 방출된다.

fun main() = runBlocking<Unit> {
    flowOf(1, 2, 3, 4, 5).collect { value ->
        println(value)
    }
}
1
2
3
4
5

3) asFlow

컬렉션이나 시퀀스를 전달해 플로우를 만들 수 있다.

fun main() = runBlocking<Unit> {
    listOf(1, 2, 3, 4, 5).asFlow().collect { value ->
        println(value)
    }
    (6..10).asFlow().collect {
        println(it)
    }
}

2-1. Flow 연산자

📝1. 중간 연산자

중간 연산자는 Flow의 데이터 스트림을 변환하거나 필터링하며, 새로운 Flow를 반환한다.

중간 연산자의 종류

  • map: Flow에서 방출된 각 값을 변환합니다.
  • filter: 조건에 맞는 값들만 필터링하여 방출합니다.
  • transform: 값을 변환하거나 여러 값을 방출할 수 있는 유연한 연산자입니다.
  • take: 지정된 개수만큼의 값만 방출합니다.
  • takeWhile: 조건이 참인 동안만 값을 방출합니다.
  • drop: 처음 몇 개의 값을 건너뛰고 이후 값을 방출합니다.
  • dropWhile: 조건이 참인 동안의 값들을 건너뜁니다.
  • onEach: 각 값이 방출될 때마다 추가 작업을 수행합니다.
  • flatMapConcat: 각 값을 변환하여 여러 Flow로 병합합니다. 변환된 Flow는 순차적으로 실행됩니다.
  • flatMapMerge: 각 값을 변환하여 여러 Flow로 병합합니다. 변환된 Flow는 동시에 실행됩니다.
  • flatMapLatest: 최신 값만을 변환하여 Flow로 병합합니다. 이전 Flow는 취소됩니다.
  • mapNotNull: null이 아닌 값만 방출하고, null 값은 건너뜁니다.
  • distinctUntilChanged: 이전 값과 다른 값만 방출합니다.
  • debounce: 일정 시간 동안 방출된 마지막 값만 방출합니다.
  • conflate: 처리 중인 값이 있는 동안 방출된 새로운 값을 버리고, 최신 값만 방출합니다.
  • buffer: Flow에서 방출된 값을 버퍼링하여, 처리 속도와 방출 속도를 비동기적으로 조정합니다.
  • combine: 여러 Flow의 값을 결합하여 하나의 Flow로 만듭니다.
  • zip: 여러 Flow의 값을 짝지어 새로운 값을 생성합니다.
  • scan: 초기 값과 Flow에서 방출된 값을 계속해서 누적하여 방출합니다.

📝2. 종단 연산자

중간 연산자는 Flow의 데이터 스트림을 변환하거나 필터링하며, 새로운 Flow를 반환한다.
종단 연산자가 호출된 후에는 Flow가 더 이상 실행되지 않기 때문에, 동일한 Flow에서 추가로 다른 종단 연산자를 사용하거나 중간 연산자를 연결할 수 없다.

종단 연산자의 종류

  • collect: Flow에서 방출된 값을 수집하고 처리합니다.
  • toList: Flow에서 방출된 모든 값을 리스트로 모아 반환합니다.
  • toSet: Flow에서 방출된 모든 값을 세트로 모아 반환합니다.
  • first: Flow에서 방출된 첫 번째 값을 반환합니다.
  • single: Flow에서 방출된 단일 값을 반환합니다(Flow가 하나의 값만 방출할 때 사용).
  • reduce: Flow에서 방출된 값들을 누적하여 하나의 값으로 결합합니다.
  • fold: 초깃값을 지정한 후 Flow에서 방출된 값들을 누적하여 하나의 값으로 결합합니다.
  • count: Flow에서 방출된 값의 개수를 셉니다.
  • launchIn: Flow를 별도의 코루틴에서 수집하여 실행합니다.
  • collectLatest: Flow에서 새로운 값이 방출될 때 이전 수집 작업을 취소하고 새로운 값을 수집합니다.
  • last: Flow에서 방출된 마지막 값을 반환합니다.
  • singleOrNull: Flow에서 방출된 단일 값이 있으면 반환하고, 없으면 null을 반환합니다.

3-1. StateFlow와 SharedFlow

Kotlin의 Flow API의 일환

📝 StateFlow

📝 SharedFlow

profile
내가 이해하기 쉽게 쓰는 블로그

0개의 댓글