Android Q&A/Android One a day
[안드로이드 면접] - 20 :
Jman
2023. 2. 24. 10:16
1. Dispatchers 를 하드코딩 하면 안되는 이유
더보기
아래는 하드코딩을 하는 경우이다.
// DO inject Dispatchers
class NewsRepository(
private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
) {
suspend fun loadNews() = withContext(defaultDispatcher) { /* ... */ }
}
// DO NOT hardcode Dispatchers
class NewsRepository {
// DO NOT use Dispatchers.Default directly, inject it instead
suspend fun loadNews() = withContext(Dispatchers.Default) { /* ... */ }
}
구글 권고하는 사항이다. 디스패처는 하드코딩하지마라.
삽입 패턴을 이용한다면, 단위테스트와 계측 테스트의 디스패처를 테스트 디스패처로 교체하여 테스트를 더 확정적으로 만들수 있으므로 테스트하기가 더욱 쉬워진다.
어떤 식으로 코드를 짜야하는 지 아래코드가 있다. 숙지.
Before
@InstallIn(SingletonComponent::class)
@Module
object CoroutinesScopesModule {
@Singleton
@Provides
fun providesCoroutineScope(): CoroutineScope {
return CoroutineScope(SupervisorJob() + Dispatchers.Default)
}
}
After
@InstallIn(SingletonComponent::class)
@Module
object CoroutinesDispatchersModule {
@DefaultDispatcher
@Provides
fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default
@IoDispatcher
@Provides
fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO
@MainDispatcher
@Provides
fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main
@MainImmediateDispatcher
@Provides
fun providesMainImmediateDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate
}
@InstallIn(SingletonComponent::class)
@Module
object CoroutinesScopesModule {
@Singleton
@Provides
fun providesCoroutineScope(
@DefaultDispatcher defaultDispatcher: CoroutineDispatcher
): CoroutineScope = CoroutineScope(SupervisorJob() + defaultDispatcher)
}
2. 확장함수를 사용한 걸 자바로 변경한다면 어떤식으로 변경될까?
더보기
코틀린 확장함수를 자바코드로 변환 시, 정적 팩토리 메소드로 변환이 된다. 즉, Java static method 로 변환이 된다고 알면 된다.
그래서 만약 자바에서 코틀린 함수를 사용한다면??
결국, Java static method 는 해당 클래스를 인스턴스화 하여 접근하는 게 아니라 클래스.메소드명 자체로 접근 해야하기 때문에 확장함수를 자바 코드로 변경 시에 오류가 발생할 수 있다.
3. 액티비티에서 다른 액티비티를 호출할 때 생명주기
더보기
A Activitiy -> B Activity 로 전환
A, onPause() -> B, onCreate() -> B, onStart() -> B, onResume()
B Activity -> A Activity 로 다시 전환 (B 종료)
B, onPause() -> A, onResume() -> B, onStop() -> B, onDestroy()