Jetpack Compose에서 Recomposition의 동작 원리를 설명하고, 불필요한 Recomposition을 최소화하여 Compose UI 성능을 최적화하는 구체적인 전략들을 제시해 보세요.
힌트 · `remember` 사용, `stable` 타입 정의, `key` 활용, 람다 캡처링 방지 등을 고려해야 합니다. Compose 컴파일러 리포트를 분석하는 것도 중요합니다.
모범답안
Jetpack Compose에서 Recomposition은 상태(State)가 변경되었을 때 UI를 업데이트하는 과정입니다. Compose는 변경된 부분만 다시 그리는 방식으로 동작하여 효율성을 높입니다.
Recomposition 최적화를 위해 몇 가지 전략을 사용할 수 있습니다. 첫째, remember를 사용하여 불필요한 객체 생성을 막고, 상태를 유지합니다. 둘째, stable 타입으로 정의된 데이터 클래스를 사용하여 Compose가 변경 여부를 더 정확하게 판단하도록 돕습니다. 셋째, key를 사용하여 특정 컴포저블이 업데이트되어야 하는지 명시적으로 지정할 수 있습니다. 넷째, 람다 캡처링을 최소화하여 불필요한 Recomposition을 방지합니다. 예를 들어, 람다 내에서 외부 상태를 직접 사용하는 대신, 필요한 값만 인자로 전달하는 것이 좋습니다.
마지막으로, Compose 컴파일러 리포트를 분석하여 어떤 컴포저블이 Recomposition을 유발하는지 파악하고, 개선점을 찾는 것이 중요합니다. derivedStateOf를 사용하여 특정 상태에 의존하는 값을 계산하고, 해당 값의 변경에 따라서만 Recomposition이 일어나도록 할 수도 있습니다. 이러한 전략들을 통해 Compose UI의 성능을 효과적으로 최적화할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 Android / Kotlin 면접 질문
- 코틀린 코루틴에서 Dispatchers.Main, Dispatchers.IO, Dispatchers.Default의 역할과 각각 어떤 종류의 작업에 적합한지 구체적인 사용 사례와 함께 설명해주세요.
- Android에서 Hilt(또는 Dagger Hilt)를 사용하여 의존성 주입(DI)을 구현할 때, @Inject, @Module, @Provides 어노테이션의 역할과 사용 방법에 대해 설명하고, 빌드 타임에 어떻게 의존성 그래프가 생성되는지 간략하게 설명해 주세요.
- Android Jetpack Navigation Component를 사용하여 앱 내 화면 간 이동을 구현할 때의 장점은 무엇이며, NavController, NavGraph, NavHostFragment가 각각 어떤 역할을 하는지 설명해주세요.
- 대규모 안드로이드 프로젝트에서 멀티 모듈 아키텍처를 도입할 때의 장점과 단점을 설명하고, 모듈 간의 의존성 관리 및 순환 의존성 문제를 해결하는 방안에 대해 논의해 보세요.
- Android 8.0 (Oreo) 이후 강화된 백그라운드 실행 제한 사항들을 설명하고, 이러한 제약 하에서 안정적이고 효율적인 백그라운드 작업을 구현하기 위한 Jetpack WorkManager 활용 전략을 제시해 보세요.
- 코루틴의 Dispatchers 종류와 각 Dispatcher의 역할에 대해 설명하고, CoroutineScope를 올바르게 사용하여 메모리 누수를 방지하고 코루틴 생명주기를 관리하는 방법에 대해 구체적인 예시와 함께 설명해 주세요.