본문 바로가기

Android/Flow13

[Android] Flow 결합 연산자: zip과 combine 차이 코틀린 Flow를 다루다 보면 여러 Flow를 하나로 결합해야 하는 경우가 자주 발생합니다.이때 사용할 수 있는 대표적인 연산자가 바로 zip과 combine입니다.이번 글에서는 zip과 combine이 어떻게 다른지, 코드 예시와 함께 자세히 알아보겠습니다. zipzip은 두 Flow에서 각각 하나씩 값을 받아 쌍(Pair)을 만들어 새로운 Flow를 생성합니다.즉, 하나의 값이 발행되면 다른 Flow의 값이 발행될 때까지 기다린 후 결합하는 특징을 갖습니다.또한, 한쪽 Flow가 완료되면 결과 Flow도 즉시 완료되고, 나머지 Flow는 취소됩니다. 마블 다이어그램을 살펴보면,첫번째 flow에서는 숫자 1, 2, 3을 방출하고 있고, 두번째 flow에서는 문자 "A", "B", "C", "D"를 방출.. 2025. 4. 29.
[Android] Flow의 emit은 왜 suspend함수일까? Kotlin에서 비동기 스트림을 처리할 때 사용하는 Flow는 간결하고 강력한 API를 제공합니다. 특히 Flow를 사용할 때 자주 등장하는 emit() 함수가 눈에 띄는데요, 문서나 코드에서 보면 emit()이 suspend 함수로 정의되어 있다는 것을 알 수 있습니다.그렇다면, 왜 emit()은 일반 함수가 아니라 suspend 함수로 설계되었을까요? 결론 부터 말하면, Backpressure(역압) 때문인데요.그 이유 대해서 자세히 살펴보도록 하겠습니다.emit()이 하는 일은?간단히 말해, emit()은 Flow 내부에서 데이터를 외부로 발행(emit) 하는 역할을 합니다.flow { emit(1) emit(2) emit(3)} 위 코드는 1, 2, 3이라는 값을 순차적으로 소비자.. 2025. 4. 13.
[Android] Flow에서 비동기 처리를 병렬로 하는 방법 안드로이드 개발을 하다 보면 여러 개의 비동기 작업(API 호출 등)을 동시에 병렬로 실행하고, 그 결과를 Flow로 처리하고 싶은 경우가 자주 발생합니다. Kotlin의 Flow는 기본적으로 순차적 처리에 최적화되어 있지만, 병렬 처리를 위해 몇 가지 강력한 방법들을 제공합니다.이 글에서는 Kotlin Flow에서 비동기 API를 병렬로 호출하는 주요 방법을 세 가지로 정리해보겠습니다. flow에서 비동기 처리를 병렬로 하는 방법ID 목록을 받아 각 ID에 대해 비동기 API 호출을 병렬로 처리하고 결과를 수집하는 상황을 가정해봅니다.fun idsFlow(): Flow = flowOf(1, 2, 3, 4, 5)suspend fun fetchData(id: Int): String { delay(10.. 2025. 4. 13.
[Android] StateFlow의 원자성 보장 방법 (feat. update) StateFlow의 값 갱신 방법Flow의 값을 갱신할 때 사용되는 emit, value, update 세 가지 방법은 각각 고유한 특징과 차이점이 있습니다. 이들을 구분하여 이해하면 더 효율적으로 Flow를 활용할 수 있습니다.1. emitemit은 Flow에서 값을 갱신하고 방출하는 가장 기본적인 방법입니다. emit은 suspend 함수로, Flow의 생산자에서 값을 방출할 때 사용됩니다.2. valuevalue는 Flow의 MutableStateFlow와 같은 상태 관리 객체에서 사용하는 프로퍼티입니다. 이 프로퍼티를 통해 값을 동기적으로 변경하고 접근할 수 있습니다.emit과 기능적으로 비슷하지만, value는 코루틴 외부에서도 동기식으로 호출할 수 있다는 차이가 있습니다. 예를 들어, valu.. 2025. 2. 18.
[Android] 이벤트 처리 Channel vs SharedFlow 안드로이드에서 이벤트(사이드 이펙트)는 주로 channel 또는 sharedFlow를 사용해 처리한다.channel을 이용한 이벤트 처리 예시 코드private val _effect: Channel = Channel()val effect = _effect.receiveAsFlow()sharedFlow를 이용한 이벤트 처리 예시 코드private val _sideEffectFlow: MutableSharedFlowval sideEffectFlow: SharedFlow = _sideEffectFlow.asSharedFlow() 그렇다면 SharedFlow와 Channel을 사용한 이벤트 처리의 차이점은 뭘까?각각의 장단점에 대해 알아보자. Channel장단점장점 : 백그라운드에서 발생한 이벤트도 수집 가능단.. 2025. 2. 18.
[Android] 안드로이드 환경의 Flow Lifecycle Flow는 LiveData처럼 android에서 lifecycle에 따라 자동으로 멈추거나 재시작되지 않습니다. 따라서 위에서 사용했던 예제의 경우 home키로 화면을 나가더라도 종료되지 않고 계속해서 emit 되는 값을 collect 합니다.override fun onCreate(savedInstanceState: Bundle?) { ... MainScope().launch { testViewModel.connectionFlow.collect { Log.i(TAG, "connectionFlow: $it") } } ...} Flows in Android UIAndroid UI에서 최적의 방법으로 flow를 수집하는 방법을 .. 2025. 2. 17.