개발/Android

Android Context 이해

MiJey 2020. 1. 15. 16:35

안드로이드 개발을 하다 보면 Context를 여기저기에서 많이 쓰게 됩니다.

처음에는 Context의 개념이 와닿지가 않아서 그냥 예제 코드를 복붙하는 수준에서 이해하고는 하죠.

 

흔한 초보 개발자 🙋‍♀️

🙋‍♀️ 파일 경로를 가져오고 싶어요.
💁‍♂️ context.filesDir로 가져올 수 있습니다.
🙋‍♀️ 이렇게 하면 파일 경로를 가져올 수 있구나! (context가 뭔진 모르겠지만 어쨌든 목적은 달성)

심지어 Activity == Context라고 이해하고 넘어가기도 합니다

// Activity에서는 다음 문장들이 별 차이가 없다
this.getDrawable(R.drawable.my_image)
getDrawable(R.drawable.my_image)
applicationContext.getDrawable(R.drawable.my_image)
baseContext.getDrawable(R.drawable.my_image)

 

하지만 Activity에서만 코딩하는 것에서 벗어나게 되면 점점 헷갈리게 되죠.

Context의 개념에 대해서 알아보기 시작한 단계가 되었다면 안드로이드 시스템에 대한 전반적인 이해가 필요합니다.

더보기

이런 것들도 알아보세요.

- 안드로이드 4대 컴포넌트(Activity, Service, Broadcast Receiver, Content provider)
- 액티비티 간에 변수를 넘길 수 없는 이유와 Intent에 대해서

 

이번 포스트에서는 Context에 대해 알아보도록 하겠습니다.

 

Context 정의

안드로이드 공식 문서

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

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.

(번역)
응용 프로그램 환경에 대한 글로벌 정보에 대한 인터페이스입니다. 이것은 안드로이드 시스템에 의해 구현되는 추상 클래스입니다. 응용 프로그램 별 리소스 및 클래스에 대한 액세스는 물론 활동 시작, 방송 및 수신 의도 등과 같은 응용 프로그램 수준 작업을 위한 업 콜에 액세스 할 수 있습니다.

와! 정말 무슨 말인지 하나도 모르겠네요!

그럼 Context는 어떨 때 사용했는지 떠올려볼까요?

Context 사용 예시

  • Activity나 Service를 시작 (startActivity, startService, ...)
  • 앱이 가지고 있는 각종 자원을 가져올 때 (getDrawable, getString, getColor, ...)
  • 앱이 가지고 있는 여러 정보를 가져올 때 (getPackageName, getFilesDir, ...)
  • 권한 확인 (checkPermission)
  • SharedPreferences
  • sendBroadcast

 

사용 예시를 보니 감이 좀 잡히시나요?

시스템에서 무언가 가져오거나 하려고 할 때 Context를 사용하네요.

 

그래서 Context는 신분증에 많이 비유하곤 합니다.

앱이 시스템에게 무언가를 요청 할 때 Context를 내밀면서 내가 이걸 요청할 권한이 있음을 알려주는 것이죠.

신분증을 가지고 동사무소 가서 등본 떼듯이 Context를 가지고 시스템에게서 정보를 가져오는 거라고 이해하시면 됩니다. (정확히는 안드로이드 시스템에서 직접 가져오는게 아니라 ActivityManagerService를 통해 가져옵니다. 등본 떼려고 청와대에 가는건 아닌 것에 비유할 수 있겠네요.)

 

Context의 정의를 다시 한 번 살펴볼까요.

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.

(번역)
응용 프로그램 환경에 대한 글로벌 정보에 대한 인터페이스입니다. 이것은 안드로이드 시스템에 의해 구현되는 추상 클래스입니다. 응용 프로그램 별 리소스 및 클래스에 대한 액세스는 물론 활동 시작, 방송 및 수신 의도 등과 같은 응용 프로그램 수준 작업을 위한 업 콜에 액세스 할 수 있습니다.

 

Context

앱의 리소스를 가져올 때, 앱에서만 할 수 있는 작업을 해야 할 때 사용하는 통로

 

Context 사용 시 주의사항

Application, Service, Activity 모두 Context를 상속받습니다. 따라서 모두 Context이기에 공통적으로 할 수 있는 일이 있는 반면, 각각에서만 할 수 있는 일도 있습니다. 또한 각 클래스에서 받아오는 Context의 생명 주기도 달라지기 때문에 Context가 필요한지에 따라서 어떤 Context를 사용할지 잘 선택해야 합니다.

 

  • 일반적으로는 context가 무언가를 가져오거나 요청하기 위해 '잠깐' 필요하므로 가장 가져오기 편한 context를 사용하면 됩니다.
  • Activity(또는 Service)에서 생성한 클래스 인스턴스에서, Activity(또는 Service)가 사라져도 계속해서 Context가 필요하다면 Application Context를 받아옵니다.
  • Activity가 Application Context를 참조하게 되면 Activity가 종료되더라도 해당 참조는 남아있기 때문에 Activity가 GC(Garbage Collection)에 의해 정리되지 않으므로 메모리 누수가 발생할 수 있습니다.
  • GUI 관련 작업은 Acitivity가 필요합니다. 예를 들어 AlertDialog를 만들 때 Application Context를 사용하면 에러가 납니다.

 

 


참고 사이트

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

https://www.charlezz.com/?p=1080

https://shnoble.tistory.com/57