코딩스토리

[Android/안드로이드] Context, 뭐하는 녀석인지 알고 사용하자! 본문

Android/유용한 기술

[Android/안드로이드] Context, 뭐하는 녀석인지 알고 사용하자!

라크라꾸 2022. 3. 8. 01:31

Context란?

현재 사용되고 있는 애플리케이션(또는 액티비티)에 대한 포괄적인 정보를 지니고 있는 객체입니다.

  • Application의 현재 상태를 나타냅니다.
  • Activity와 Application의 정보를 얻기 위해 사용할 수 있습니다.
  • Resource, Database, SharedPreference 등에 접근하기 위해 사용할 수 있습니다.
  • Activity와 Application 클래스는 Context 클래스를 확장한 클래스입니다.

 

Context의 잘못된 사용법 

Context는 안드로이드 앱 개발을 할 때 모든 곳에서 쉽게 접근할 수 있습니다. 하지만 잘못 사용하게 되면 메모리 누수를 발생시킬 수 있습니다.

  • ViewModel 등에서 Activity를 멤버 변수로 참조하는 경우.
  • non-static inner class로 선언된 Handler를 Activity에서 사용하는 경우.
  • (Text) View를 static 변수로 선언하고 Activity가 이를 참조하는 경우
  • Singleton에서 Activity를 참조하는 경우

 

컨텍스트는 크게 두 종류로 나뉩니다.

1. Application Context

ApplicationContext는 Application LifeCycle을 따르며 애플리케이션이 실행되어 종료될 때까지 동일한 객체를 참조합니다.

 

 

2. Activity Context

ActivityContext는 Activity LifeCycle을 따르며 Activity가 onDestroy() 될 때 context는 사라지게 됩니다.

 

Application Context와 Activity Context 간 계층은 다음과 같습니다.

 

 

 

Context는 어떻게 사용해야 할까?

위에서 말한대로 Context를 잘못 사용하면 메모리 누수를 발생할 수 있습니다. 하지만 잘만 사용한다면 편리하게 사용할 수 있습니다.

예를 들어 ViewModel에서 ActivityContext를 주입해 사용할 경우 문제가 발생할 수 있습니다.

 

 

위와 같은 방법대로 ActivityContext를 ViewModel이 주입을 받았다고 가정을 한다면, 굉장히 안 좋은 상황이 발생하게 됩니다.

순서대로 작업을 실행해보겠습니다.

 

 

  1. 액티비티에서 ViewModel에 ActivityContext 주입
  2. ViewModel에서 데이터베이스 접근하는 코드를 작성
  3. 여기서 가정이 필요합니다. 호출을 했을 때 데이터를 불러오는 시간을 3초라고 가정을 해봅니다.
  4. 데이터를 불러오는 시간보다 먼저 Activity를 종료합니다.

이렇게되면 무슨 상황이 발생할까요??

Room에 접근하기 위해서는 Context객체가 필요한데 보시다시피 ViewModel에서 참조하고 있는 ActivityContext가 Activity가 종료가 되면서 메모리 누수 현상이 발생하게 됩니다. 이러면서 앱은 강제 종료가 되며 사용자는 불편을 겪게 됩니다.

그렇다면 ViewModel에서는 Context를 참조하면 안되나? 라는 의문점을 가질 수 있습니다. 

ApplicationContext를 사용하게되면 해결됩니다. 안드로이드에서 제공하는 AndroidViewModel에서도 ApplicationContext를 참조하게 되는데, 이와 같이 ApplicationContext를 참조하게 되면 Activity의 생명주기와는 관계없이 끝까지 살아남게 됩니다.

 

그럼 모든 Context를 ApplicationContext를 사용하면 되나?

정답은 No입니다. ApplicationContext는 ActivityContext가 지원하는 모든 것을 지원하지 않기 때문에, GUI와 관련된 모든 것에 대해서는 ApplicationContext가 정상적으로 작동하지 않을 수 있습니다. 그렇기 때문에 무조건 ApplicationContext를 사용하는 것은 잘못된 방법입니다. Dialog, Toast 등, 화면 관련된 Context는 ActivityContext를 사용해줍니다.

Comments