Kotlin Flow 기반의 StateFlow와 Android 아키텍처 컴포넌트의 LiveData는 각각 어떤 특징을 가지고 있으며, UI 상태 관리에 있어 어떤 상황에서 어떤 것을 사용하는 것이 더 효과적인지 비교하여 설명해주세요.
힌트 · LiveData는 lifecycle-aware하며 단일 값에 최적화되어 있고, StateFlow는 Flow의 강력한 연산자를 활용하며 cold/hot stream 특성을 가집니다. 사용 사례와 리소스 소모 측면에서 비교하세요.
모범답안
StateFlow와 LiveData는 모두 UI 상태 관리에 사용되지만 몇 가지 중요한 차이점이 있습니다.
LiveData는 Android 아키텍처 컴포넌트의 일부로, lifecycle-aware하다는 장점이 있습니다. 즉, Activity나 Fragment의 lifecycle 상태를 자동으로 감지하여 불필요한 업데이트를 방지합니다. 또한 단일 값 홀더로서 간단한 데이터 스트림에 최적화되어 있습니다.
반면 StateFlow는 Kotlin Flow 기반으로, 더 강력한 연산자를 활용할 수 있습니다. Hot stream이기 때문에 구독 시점에 관계없이 항상 최신 값을 방출하며, 여러 개의 값을 지속적으로 방출하는 복잡한 상태 관리에 유용합니다.
어떤 것을 선택할지는 상황에 따라 다릅니다. 간단한 UI 상태 업데이트, lifecycle 관리가 중요한 경우에는 LiveData가 적합합니다. 복잡한 상태 변화를 처리하고 Flow의 다양한 연산자를 활용하고 싶다면 StateFlow가 더 나은 선택일 수 있습니다. StateFlow는 LiveData에 비해 리소스 소모가 더 클 수 있다는 점도 고려해야 합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 Android / Kotlin 면접 질문
- Activity의 onPause()와 onStop() 메서드는 어떤 차이가 있으며, 각각 어떤 상황에서 호출되고 어떤 작업을 수행하는 것이 적절한가요?
- Fragment의 onCreateView()와 onViewCreated() 메서드의 호출 시점과 역할의 차이점을 설명하고, 각각 어떤 종류의 작업을 수행하는 것이 권장되는지 예시와 함께 설명해 주세요.
- Android 아키텍처 컴포넌트 중 ViewModel의 역할과 장점은 무엇이며, Activity 또는 Fragment의 생명주기와 어떻게 독립적으로 데이터를 유지할 수 있는지 설명해주세요.
- 코틀린 코루틴에서 Dispatchers.Main, Dispatchers.IO, Dispatchers.Default의 역할과 각각 어떤 종류의 작업에 적합한지 구체적인 사용 사례와 함께 설명해주세요.
- Android에서 Hilt(또는 Dagger Hilt)를 사용하여 의존성 주입(DI)을 구현할 때, @Inject, @Module, @Provides 어노테이션의 역할과 사용 방법에 대해 설명하고, 빌드 타임에 어떻게 의존성 그래프가 생성되는지 간략하게 설명해 주세요.
- Android Jetpack Navigation Component를 사용하여 앱 내 화면 간 이동을 구현할 때의 장점은 무엇이며, NavController, NavGraph, NavHostFragment가 각각 어떤 역할을 하는지 설명해주세요.