Android Context에 관해서

dev_yo·2025년 11월 17일
post-thumbnail

안녕하세요 👋

Android 개발을 하다보면 흔하게 Context 를 쓰고 있지만 사실 누군가 Context 가 뭔가요? 라고 물어보면 재대로 설명하기는 어려운데요.
그래서 이번 포스팅에선 Context 에 관해서 한번 알아 보려고 합니다!

1. Context

Context앱과 시스템 리소스 간의 상호 작용을 가능하게 하는 안드로이드의 핵심 구성요소 입니다.


2. Context는 왜 필요할까?

안드로이드에서 대부분의 기능은 OS 자원을 기반으로 작동합니다. 이 자원들은 ActivityApplication 이 직접 소유하고 있는 것이 아니라, 시스템이 관리하는 구조이기 때문에 Context 를 통해 접근해야 합니다.

val text = context.getString(R.string.app_name)
val connectivityManager = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

3. Context의 종류

1) Application Context

  • Application 의 라이프 사이클과 연결되어 있음

  • 현재 ActivityFragment 와 독립적인 전역적이고 오래 지속되는 Context가 필요할 때 사용

  • SharedPreferencesDatabase 와 같은 앱 전체 리소스 접근하는 경우 사용

  • 전체 앱 생명주기 동안 지속되어야 하는 BroadcastReceiver를 등록하는 경우 사용

  • 앱 생명주기 동안 유지되는 라이브러리나 컴포넌트를 초기화하는 경우 사용

object Singleton { // Singleton 객체에는 Application Context 사용
    lateinit var applicationContext: Context
}

2) Activity Context

  • Activity 의 생명주기와 연결되어 있음

  • Activity 에 특정한 리소스 접근, 다른 Activity 시작, 레이아웃 인플레이션에 사용

  • UI 컴포넌트를 생성 또는 업데이트하는 경우 사용

  • 다른 Activity 실행하는 경우 사용

  • 현재 Activity 범위에 있는 리소스나 테마에 접근하는 경우 사용

val dialog = AlertDialog.Builder(context.applicationContext) // ❌

Application Context는 테마에 대한 리소스 정보가 없으므로 AlertDialog 사용에 부적합합니다.

val dialog = AlertDialog.Builder(activityContext) // ✅

3) Service Context

  • Service 의 생명주기와 연결되어 있음

  • 주로 네트워크 작업 수행이나 음악 재생과 같은 백그라운드에서 실행되는 작업에 사용

4) Broadcast Context

  • BroadcastReceiver 가 호출될 때 제공

  • 수명이 짧고 일반적으로 특정 브로드캐스트에 응답하는 데 사용

  • 그렇기 때문에 Broadcast Context로 장기적인 태스크를 수행하면 안됨

❗️ Context 사용시 주의 사항

Context 는 메인 스레드용으로 설계되었으며, 리소스에 접근하거나 UI와 상호 작용할 메인 스레드에 의존합니다.
백그라운드 스레드에서 Context 를 사용하면 크래시 발생 및 예기치 않은 문제가 발생 할 수 있기에 백그라운드에서 작업하는 도중에 UI 관련 Context 리소스와 상호 작용이 필요하다면, 반드시 메인 스레드로 다시 전환해야 합니다.


4. Activity의 this 와 baseContext에 대해서

Activity 에서 thisbaseContext 모두 Context를 반환한다는 공통점이 있지만, 서로 다른 수준을 가지고 나타내고 다른 목적을 가지고 있습니다.

1) this

  • Activity 클래스의 현재 인스턴스를 참조합니다.

  • 생명주기 관리 및 UI와의 상호 작용과 같은 추가 기능을 포함하여 Activity 와 상호작용이 가능한 API를 호출 가능

  • 해당 Activity에서 제공하는 고유한 메서드를 호출 가능
    (다른 Activity를 시작, 해당 Activity에 종속된 다이얼로그를 띄워야 하는 경우)

val intent = Intent(this, AnotherActivity::class.java)
startActivity(intent)

val dialog = AlertDialog.Builder(this)
    .setTitle("title")
    .setMessage("message")
    .show()

2) baseContext

  • Activity 가 구축되는 기반 또는 기본 Context를 나타냄

  • Activity 가 상속하고 있는 ContextWrapper 클래스의 일부

  • 보통 직접사용하는 경우는 거의 없음
    (커스텀 ContextWrapper을 작업이 필요한 경우)

구분thisbaseContext
범위Activity 인스턴스 자체Activity의 기반이 되는 Context
사용 위치UI, Activity 시작, Dialog 등커스텀 ContextWrapper 작업

5. 마치며

정리하다 보니 생각보다 Context 가 참 복잡하고 다양한 역할을 하고 있다는 걸 다시 느끼게 되었습니다.

평소엔 무심코 사용하던 context 라는 파라미터가 실제로는 앱 전체를 이어주는 핵심 요소라는 점이 새삼 재밌다고 느껴졌습니다!

이번 글이 여러분에게 도움이 되었으며 좋겠습니다. 😇
그럼 오늘도 즐코 하세요 🙇‍♂️


📚 Reference

Android Manifest Interview <저자: 엄재웅(skydoves)>

Android Developers (Context)

profile
어제보다 발전한 오늘이 되고픈 🧑🏻‍💻

0개의 댓글