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()