오늘은 android의 context에 대해 정리해보고자 한다.
context가 무엇이냐?
사전적 의미를 생각한다면 맥락, 문맥 정도로 생각할 수 있다.
android의 context는 어플리케이션에 대해 현재 상태를 나타내는 역할, 앱이 흘러가는 맥락 정도로 해석해 볼 수 있다.
애플리케이션 환경에 대한 전역 정보에 대한 인터페이스입니다. 안드로이드 시스템에서 구현이 제공되는 추상 클래스입니다. 이를 통해 애플리케이션별 리소스 및 클래스에 액세스할 수 있을 뿐만 아니라 활동 시작, 브로드캐스트 및 인텐트 수신 등과 같은 애플리케이션 수준 작업에 대한 업콜을 수행할 수 있습니다.
전혀 이해가 안간다.
친절한 외국인의 글을 참고 해보자.
context는 안드로이드 개발에서 매우 중요하기 때문에 잘 알아야한다. context를 잘못 사용하게 되면 메모리 leak이 발생할 수 있다.
안드로이드 내부에는 2가지의 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의 생명주기를 따른다.
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를 전달해주면 된다.
대부분의 경우 가장 가까운, scope에 해당하는 context를 직접 사용하자. 참조가 해당 component의 life cycle을 넘어서지 않는 이상 메모리 누수 걱정 없이 component를 유지할 수 있다. activity나 service 이외의 객체에서 context를 참조하는 경우 activity context가 아닌, application context로 전환하라.
아 아래는 쉅시간에 레아😊가 보여주신 표이다.
아래를 참고하면 context를 사용하는데 유용할 것 같다.
생각보다 뭐가 없는거 같기도하고..
그냥 배고픈거 같기도 하고..