면접 질문실전 질문꼬리 질문

안드로이드에서 Context 사용 시 주의 사항

skydovesJaewoong Eum (skydoves)||7분 소요

안드로이드에서 Context 사용 시 주의 사항

Context는 안드로이드 개발에서 가장 빈번하게 사용되는 객체 중 하나입니다. 애플리케이션 리소스, 시스템 서비스, 데이터베이스, SharedPreferences, 파일 시스템 등에 접근할 때 반드시 필요하며, 안드로이드 프레임워크의 거의 모든 기능과 연결되어 있습니다. 하지만 Context를 잘못 사용하면 메모리 누수(memory leak), 크래시, 그리고 추적하기 어려운 미묘한 버그의 주요 원인이 되기도 합니다. 어떤 상황에서 어떤 Context를 사용해야 하는지, 그리고 생명주기(lifecycle)를 넘어 Context를 유지하지 않는 방법은 면접에서도 반복적으로 다뤄지는 주제입니다. 이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • Activity 컨텍스트와 Application 컨텍스트의 차이점 및 올바른 사용 사례를 구분할 수 있습니다.
  • 장기 생존 객체에 Activity 컨텍스트를 유지하면 메모리 누수가 발생하는 원리를 파악할 수 있습니다.
  • Application 컨텍스트가 다이얼로그 표시 등 UI 작업에 적합하지 않은 이유를 설명할 수 있습니다.
  • Context를 활용한 UI 작업에서 스레드 제약 조건을 이해할 수 있습니다.

Activity Context vs Application Context

안드로이드에는 개발자가 직접 다루는 두 가지 주요 Context 유형이 있습니다. Activity 컨텍스트는 특정 Activity 인스턴스의 생명주기에 종속되며, 해당 Activity의 테마, 윈도우, UI 구성 정보를 포함합니다. 반면 Application 컨텍스트는 애플리케이션 프로세스가 살아 있는 동안 유지되며, 특정 UI 컴포넌트에 종속되지 않습니다.

일반적인 원칙은 다음과 같습니다. UI 작업에는 Activity 컨텍스트를 사용하고, 단일 Activity보다 오래 지속되는 작업에는 Application 컨텍스트를 사용합니다.

// UI 작업: Activity 컨텍스트 사용
val dialog = AlertDialog.Builder(activityContext)
    .setTitle("Confirm")
    .setMessage("Are you sure?")
    .create()

// 비 UI 작업: Application 컨텍스트 사용
val prefs = applicationContext
    .getSharedPreferences("settings", Context.MODE_PRIVATE)

Application 컨텍스트로 레이아웃을 인플레이트하거나 다이얼로그를 생성하면 문제가 발생할 수 있습니다. Application 컨텍스트에는 테마 정보가 포함되어 있지 않기 때문에, 해당 UI 컴포넌트는 Activity에 설정된 테마 대신 시스템 기본 테마를 사용하게 되어 시각적인 불일치가 나타납니다. 면접에서도 이 부분을 명확하게 구분하여 설명하실 수 있어야 합니다.

Context 참조 유지로 인한 메모리 누수

Context와 관련된 가장 흔한 버그는 장기 생존 객체에 Activity 컨텍스트를 유지하는 것입니다. 특정 객체가 Activity에 대한 참조를 보유한 채 Activity보다 오래 살아남으면, 가비지 컬렉터(garbage collector)가 해당 Activity와 그에 속한 모든 뷰 및 리소스를 회수할 수 없게 됩니다.

// 메모리 누수를 유발하는 코드
object AppSingleton {
    var context: Context? = null
}

class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Activity 참조를 싱글톤에 저장하여 메모리 누수 발생
        AppSingleton.context = this // Activity 누수 발생 지점
    }
}

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기