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

안드로이드의 Context

skydovesJaewoong Eum (skydoves)||6분 소요

안드로이드의 Context

Context는 안드로이드에서 애플리케이션 리소스, 시스템 서비스, 컴포넌트 생명주기 정보에 접근할 수 있도록 해 주는 기본(base) 클래스입니다. 모든 Activity, Service, Application, BroadcastReceiverContext를 직접 상속하거나, Context를 전달받아 사용합니다. 잘못된 유형의 Context를 선택하는 실수는 안드로이드 개발에서 메모리 누수와 크래시를 일으키는 가장 흔한 원인 중 하나이며, 면접에서도 자주 등장하는 주제이므로 확실히 짚고 넘어가는 것이 좋습니다. 이 챕터를 마치면 다음 내용을 이해하실 수 있습니다.

  • Context의 역할과, 컴포넌트가 안드로이드 시스템에 연결되는 방식
  • Application, Activity, Service, BroadcastReceiver 컨텍스트 간 차이점
  • 상황별로 어떤 Context 유형을 사용해야 하는지 판단하는 기준
  • 잘못된 Context 참조로 인한 메모리 누수를 방지하는 방법

Context가 제공하는 기능

Context는 컴포넌트가 안드로이드 환경에 접근할 수 있게 해 주는 추상 클래스입니다. Context를 통해 리소스 조회(getString(), getDrawable()), 시스템 서비스 접근(getSystemService()), 컴포넌트 시작(startActivity(), startService()), 데이터베이스 열기, SharedPreferences 읽기, 레이아웃 인플레이션 등 다양한 작업을 수행할 수 있습니다. 안드로이드 프레임워크와의 거의 모든 상호작용에 Context가 필요하다고 보면 됩니다.

// 리소스 접근
val appName = context.getString(R.string.app_name)

// Activity 시작
context.startActivity(Intent(context, DetailActivity::class.java))

// 시스템 서비스 가져오기
val connectivityManager = context.getSystemService(
    Context.CONNECTIVITY_SERVICE
) as ConnectivityManager

내부적으로 Context는 대부분의 작업을 시스템이 생성하는 실제 구현체인 ContextImpl에 위임합니다. ActivityServiceContextWrapper를 상속하며, ContextWrapper는 내부에 ContextImpl 인스턴스를 감싸고(wrap) 호출을 위임하는 구조로 동작합니다. 이러한 래퍼(wrapper) 패턴 덕분에 Context의 동작을 유연하게 확장하거나 교체할 수 있게 됩니다.

Context의 유형

각 컴포넌트 유형은 서로 다른 특성과 생명주기 동작을 가진 Context를 제공합니다. 면접에서 이 차이를 정확히 설명하는 것이 핵심입니다.

Application Context는 프로세스 전체 수명 동안 유지됩니다. context.applicationContext 또는 Application.getApplicationContext()로 얻을 수 있습니다. 어떤 Activity의 뷰 계층도 참조하지 않으므로 싱글톤이나 오래 유지되는 객체에 안전하게 저장할 수 있습니다. 다만, 다이얼로그 표시나 테마가 적용된 뷰 인플레이션처럼 UI 컨텍스트가 필요한 작업에는 사용할 수 없다는 점에 유의해야 합니다.

Activity ContextActivity 생명주기에 바인딩되어 있습니다. 현재 테마, 윈도우, 뷰 계층 정보를 포함하고 있어 다이얼로그 표시, 테마가 적용된 레이아웃 인플레이션, 트랜지션이 포함된 Activity 전환 등 UI 작업에 반드시 필요합니다. Activity가 소멸되면 함께 소멸됩니다.

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

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

구독하기