본문 바로가기
개발/Android

Android에서 Context는 대체 무엇인가?

by Dev Aaron 2020. 11. 8.
반응형

Context는 Android 앱 개발을 하다보면 최소 1번 이상 무조건 사용하게 되는 아마도 제일 빈번히 사용하는 객체 중 하나이지 않을까 싶습니다.

자주 사용하고, 어떤 상황에서 어떻게 사용하는지는 알지만, 누군가 Context가 뭔데?라고 물어보면 선뜻 대답해주기가 어려운…
뭔가 쉽고 간결하게 정의내리기 어려운 객체입니다.

마침 이런 고민은 저뿐만 아니라 다른 개발자들 역시 해왔던 고민이고,
그중 한 분이 잘 정리해놓은 글을 찾게 되었습니다.

http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110085457720

무려 2010년도에 작성된 글인데요.
시간이 흘러서 지금도 이해가 딱 되는 글입니다.

본 포스팅은 위 글을 다시 제 개인 학습 목적으로 필요한 부분만 정리한 글입니다. 따라서 Context에 대해 좀더 궁금하신 분은 위 링크를 통해 확인 부탁드립니다.


공식 Reference에는 아래와 같이 정의하고 있습니다.

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

https://developer.android.com/reference/android/content/Context

대략 정리하면 다음과 같습니다.

  • 어플리케이션 환경에 대한 전역 정보를 담고 있는 인터페이스
  • 안드로이드 시스템에 의해 그 구현이 제공되는 추상 클래스
  • 앱 전용 리소스와 클래스로의 접근법을 제공
  • 액티비티, 브로드캐스팅, 인텐트 수신 등과 같은 어플리케이션 레벨의 동작을 위한 up-call 지원

위 내용을 한 문장으로 축약해보면 개인적으로 아래와 같이 정리할 수 있지 않을까 싶습니다.

앱에서 필요한 기능, 동작을 수행하기 위해 안드로이드 시스템과 통신하기 위한 매개체

좀 더 애매하고 어렵게 느껴질 수 있을 것 같습니다.
위와 같이 정리한 이유를 풀어서 이야기하면…

먼저 Context를 통해 우리는 앱의 전역 정보(이를 테면 packageName이나 target, minSdkVersion, permission, processName 등)와 resources, assets 등의 앱 전용 리소스들을 얻을 수 있습니다.
resources를 예로 들면, resources는 아래와 같이 ResourceManager에 의해 관리됩니다.

https://developer.android.com/guide/platform

이 Resource Manager는 안드로이드 프레임워크에 속한 것으로 앱에서 직접 접근할 수가 없는 영역입니다. 즉 시스템과 통신하기 위한 통로로 Context를 사용하게 됩니다.

또한 앱에서 다른 앱의 컴포넌트를 실행하는 케이스를 생각해봅시다.

예를 들면 웹 브라우져에서 재밌는 기사를 보았습니다. 그리고 이걸 친구에게 공유하고 싶어 공유 버튼을 누릅니다. 이때 일반적으로 어떤 앱을 통해 공유할 것인지 선택하라는 다이얼로그가 뜹니다. 이건 누가 띄워주는 걸까요? 바로 안드로이드 시스템에서 띄워줍니다.

다시 개발자 레벨에서 생각하면, 공유 버튼을 클릭하게 되면 시스템에게 요청을 해야 합니다. “내가 이 url을 친구에게 공유하고 싶어, 이 url을 친구에게 공유할 수 있는 App/Activity를 찾아 전달해줘” 라고 말입니다.
즉, SEND Action을 Intent에 담아 startActivity를 호출합니다. 이때 startActivity는 Context의 함수입니다. 그럼 안드로이드 시스템은 이 요청을 받아 해당 Intent Action을 처리할 수 있는 앱의 Activity들을 찾고, 처리할 수 있는 Activity들이 많다면 사용자에게 선택하게끔 제시합니다.
이와 같은 동작은 Activity Manager에서 담당하게 됩니다.

따라서 Android 앱에서는 사소해 보이는 작업들 조차 시스템 레벨에 의존하고 있습니다. 다시 말하면 client-server 관계를 맺고 있고, 이러한 통신은 Context를 통해 이루어 지게 됩니다.

정리하면…

resource를 얻거나, 앱의 다양한 메타 정보를 얻거나, 혹은 다른 컴포넌트를 실행하거나 하는 등의 작업들은 모두 안드로이드 시스템에게 요청해야 하며, 그 수단으로 사용하는 것이 바로 Context입니다.

안드로이드 앱 개발을 하고 있지만, 모든 것을 알고 있지는 못합니다. 혹시 제가 잘못된 정보를 전달하고 있다면 언제든지 알려주시기 바랍니다. 🙂

반응형