[안드로이드] context

Yerin·2023년 4월 19일
0

안드로이드

목록 보기
2/2
post-thumbnail

오늘은 android의 context에 대해 정리해보고자 한다.

context가 무엇이냐?
사전적 의미를 생각한다면 맥락, 문맥 정도로 생각할 수 있다.
android의 context는 어플리케이션에 대해 현재 상태를 나타내는 역할, 앱이 흘러가는 맥락 정도로 해석해 볼 수 있다.

공식문서

애플리케이션 환경에 대한 전역 정보에 대한 인터페이스입니다. 안드로이드 시스템에서 구현이 제공되는 추상 클래스입니다. 이를 통해 애플리케이션별 리소스 및 클래스에 액세스할 수 있을 뿐만 아니라 활동 시작, 브로드캐스트 및 인텐트 수신 등과 같은 애플리케이션 수준 작업에 대한 업콜을 수행할 수 있습니다.

전혀 이해가 안간다.
친절한 외국인의 을 참고 해보자.


context 핵심

  • 애플리케이션의 현재 상태를 나타낸다.
  • 액티비티와 어플리케이션의 정보를 얻기 위해 사용할 수 있다.
  • 리소스, 데이터베이스, shared preference 등에 접근하기 위해 사용할 수 있다.
  • 액티비티와 애플리케이션 클래스는 context 클래스를 확장한 클래스이다.

context는 안드로이드 개발에서 매우 중요하기 때문에 잘 알아야한다. context를 잘못 사용하게 되면 메모리 leak이 발생할 수 있다.


안드로이드 내부에는 2가지의 context가 존재한다.
오늘은 이 두가지에 대해 알아보고 공부해보자!


Application Context

싱글톤인 인스턴스이며 (즉, 처음 싱글톤 클래스가 로딩될 때 생성되어 메모리 영역을 할당받음) Activity에서 getApplicationContext()를 통해 접근할 수 있다.
이 context는 application의 life cycle에 연결되며, 현재 context와 life cycle이 분리된 context가 필요한 경우나 activity의 범위를 벗어난 context를 전달 할 때 사용할 수 있다.


예) application 내에 싱글톤 객체를 만드는데, 이 객체가 context를 필요로 할 때 Application context를 사용하면 된다. 만약 Activity context를 전달하면, 해당 object가 activity를 항상 참조하게 되어 activity가 화면에 표시되지 않는 순간에도 GC 되지 않아 메모리 leak이 발생할 수 있다.

❔ 추가 설명: Activity는 Garbage Collection이 가능하지만, Application 은 앱 프로세스가 살아있는 동안 계속하여 남아있다. 따라서 Application Context를 활용한 객체를 메모리에서 할당 해제하지 않고 있을 경우, 메모리 릭을 발생할 가능성이 농후하다.


예) application 전체에서 사용할 라이브러리를 특정 activity에서 초기화한다면?
-> 당연히 Application Context를 사용해야한다.


⭐ 즉 Activity 범위를 벗어난 곳이나 전역에서 사용될 곳에서 사용하면 되는 싱글톤 객체이다.

➕ 추상 클래스 ContentProvider를 상송한 클래스에서 getContext() 를 통해 불러 올 수 있는 context는 application context이다.


Activity Context

activity 내에서 유효한 context이며, activity의 생명주기를 따른다.
activity context는 activity와 함께 소멸해야하는 경우에 사용한다.

즉, activity와 생명주기가 같은 객체를 생성해야 할 때 activity context를 사용하면 된다.

예) 언제든 activity를 사용할 때, Toasr, Dialog 등의 UI operation에서 context가 필요하다면 이 때 activity context를 사용할 수 있다.

getBaseContext() 메서드는 자신의 context가 아닌 다른 context에 접근할 때 사용한다.
getContext와 requireContext의 차이 -> kotlin에서 require을 사용하면 non-null 보장


주의

Application Context는 Activity Context가 제공하는 기능 전체를 제공하지는 않습니다. 특히 GUI와 관련된 context 조작은 실패할 확률이 높다.

줍줍. viewModel에 어떤 context를 넘겨야 할까?
요약 ) Room에 접근하기 위해서는 Context객체가 필요한데 ViewModel에서 Activity Context를 참조하면 Activity가 종료될 때 메모리 누수 현상이 발생하게 된다. 이러면서 앱은 강제 종료가 되며 사용자는 불편을 겪게 된다. 이때는 Application Context를 전달해주면 된다.


👍 Rule of Thumb

대부분의 경우 가장 가까운, scope에 해당하는 context를 직접 사용하자. 참조가 해당 component의 life cycle을 넘어서지 않는 이상 메모리 누수 걱정 없이 component를 유지할 수 있다. activity나 service 이외의 객체에서 context를 참조하는 경우 activity context가 아닌, application context로 전환하라.


아 아래는 쉅시간에 레아😊가 보여주신 표이다.
아래를 참고하면 context를 사용하는데 유용할 것 같다.


생각보다 뭐가 없는거 같기도하고..
그냥 배고픈거 같기도 하고..

profile
𝙸 𝚐𝚘𝚝𝚝𝚊 𝚕𝚒𝚟𝚎 𝚖𝚢 𝚕𝚒𝚏𝚎 𝙽𝙾𝚆, 𝙽𝙾𝚃 𝚕𝚊𝚝𝚎𝚛 !

0개의 댓글