코틀린 코루틴에서 Dispatchers.Main, Dispatchers.IO, Dispatchers.Default의 역할과 각각 어떤 종류의 작업에 적합한지 구체적인 사용 사례와 함께 설명해주세요.
힌트 · Main은 UI 작업, IO는 네트워크/디스크 I/O, Default는 CPU-intensive 작업에 사용됩니다. 적절한 Dispatcher 선택이 성능에 미치는 영향을 설명하세요.
모범답안
코틀린 코루틴에서 Dispatchers는 코루틴이 실행될 스레드를 지정하는 역할을 합니다.
Dispatchers.Main은 UI 스레드에서 코루틴을 실행합니다. UI 업데이트와 같이 UI와 관련된 작업에 사용해야 합니다. 예를 들어, LiveData 값을 변경하거나, 뷰의 속성을 변경하는 경우 Main Dispatcher를 사용합니다.
Dispatchers.IO는 네트워크 작업이나 디스크 I/O와 같은 블로킹 I/O 작업에 최적화되어 있습니다. 데이터베이스 쿼리, 파일 읽기/쓰기, 네트워크 요청 등에 사용하면 됩니다.
Dispatchers.Default는 CPU를 많이 사용하는 작업에 적합합니다. 이미지 처리, 복잡한 계산 등 시간이 오래 걸리는 작업에 사용하면 UI 스레드를 막지 않고 백그라운드에서 처리할 수 있습니다.
적절한 Dispatcher를 선택하는 것은 앱 성능에 매우 중요합니다. UI 스레드에서 CPU를 많이 사용하는 작업을 실행하면 앱이 멈추거나 응답하지 않을 수 있습니다. 반대로, I/O 작업을 Default Dispatcher에서 실행하면 스레드 풀이 효율적으로 사용되지 않아 성능 저하가 발생할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 Android / Kotlin 면접 질문
- Fragment의 onCreateView()와 onViewCreated() 메서드의 호출 시점과 역할의 차이점을 설명하고, 각각 어떤 종류의 작업을 수행하는 것이 권장되는지 예시와 함께 설명해 주세요.
- Android 아키텍처 컴포넌트 중 ViewModel의 역할과 장점은 무엇이며, Activity 또는 Fragment의 생명주기와 어떻게 독립적으로 데이터를 유지할 수 있는지 설명해주세요.
- Kotlin Flow 기반의 StateFlow와 Android 아키텍처 컴포넌트의 LiveData는 각각 어떤 특징을 가지고 있으며, UI 상태 관리에 있어 어떤 상황에서 어떤 것을 사용하는 것이 더 효과적인지 비교하여 설명해주세요.
- Android에서 Hilt(또는 Dagger Hilt)를 사용하여 의존성 주입(DI)을 구현할 때, @Inject, @Module, @Provides 어노테이션의 역할과 사용 방법에 대해 설명하고, 빌드 타임에 어떻게 의존성 그래프가 생성되는지 간략하게 설명해 주세요.
- Android Jetpack Navigation Component를 사용하여 앱 내 화면 간 이동을 구현할 때의 장점은 무엇이며, NavController, NavGraph, NavHostFragment가 각각 어떤 역할을 하는지 설명해주세요.
- Jetpack Compose에서 Recomposition의 동작 원리를 설명하고, 불필요한 Recomposition을 최소화하여 Compose UI 성능을 최적화하는 구체적인 전략들을 제시해 보세요.