Context에 대하여

코불·2023년 9월 3일

꽤나 자주 쓰이는 Context

안드로이드 어플리케이션을 개발해본 개발자라면 context라는 클래스를 못 본 사람은 없을 것이다.
context는 그만큼 안드로이드 개발을 하는데에 있어서 친숙하기도 하면서, 없어서는 안되는 객체이다.
주로 Intent 객체를 생성할 때 사용하거나, 토스트를 띄울 때, 또는 DB에 접근할 때도 사용하는 등 많은 범위에서 빈번하게 사용할 때가 많다.
처음 안드로이드 개발을 시작할 때는 우선 객체 생성이나 어딘가에 접근이 필요할 때 Context를 필요로 하는 경우가 많아, 그냥 여러 군데에 필요한 객체 정도로만 이해하고 있었으나, Context를 제대로 이해하지 않고서는 제대로 된 안드로이드 개발이라 할 수 없을 것 같아 정리해보게 되었다.

Context가 도대체 뭘까?

context라는 단어를 단순히 사전적으로 정의하면 흐름,맥락 정도로 볼 수 있겠다.
안드로이드 내부에서 하는 역할을 들여다보면 그 의미에서 크게 벗어난 이름은 아닌 듯하다.
Context를 간략하게 정의하면 다음과 같다.

Context

  • Application의 글로벌 정보에 접근하기 위한 인터페이스
  • Applicaiton의 상태를 가지고 있음.
  • Resource,DB,SharedPreference 등에 접근하기 위해 사용됨.
  • Aplication과 Activity는 Context를 구현한 클래스
  • ApplicationContext와 ActivityContext로 나뉘어짐.

Application 및 Activity의 전반적인 정보 및 상태를 가지고 있고,
DB,Resource 또는 SharedPreference에 접근하기 위한 인터페이스 정도로 이해하면 될 것 같다.
그런데 Context는 잘못 사용하면 자칫 메모리 누수나, 오류 발생으로 이어질 수 있다.
어떠한 경우에서 이런 상황이 벌어질 수 있을까?

Context로 인해 메모리 누수가 발생하는 경우

Context는 Resource 또는 DB 등에 접근하는데 주로 사용된다.
그러나 여기에 잘못된 Context가 사용되는 경우 메모리 누수가 발생할 수 있다.
이는 두 Context의 생명주기와 관계가 있다.

ActivityContext

  • ActivityContext는 Activity의 생명주기에 종속된 Context이다.
  • 따라서 Activity 클래스가 onDestroy()가 되면, 따라서 함께 소멸된다.

ApplicationContext

  • ApplicationContext는 Application 클래스의 생명주기에 종속된 Context로,
  • 애플리케이션이 시작할 때부터 종료되는 시점까지 참조되는 싱글턴 인스턴스이다.

ActivityContex의 경우 Activity가 소멸하게 되면 자동으로 소멸하게 된다.
만일 Activity에서 가진 ViewModel이 ActivityContext를 넘겨받아 DB에 접근하고 있는데 도중에 Activity가 종료되는 경우, Activity가 종료되었음에도 불구하고 계속해서 참조하고 있을 것이고, 이는 메모리 누수로 이어질 수 있다.
그래서 이러한 상황을 방지하기 위해서는 Activity의 생명주기와 관계없이 계속해서 사용될 수 있는 ApplicationContext를 전달하는 것이 옳다.

그럼 ApplicationContext를 사용하는 게 무조건 좋은 거 아닌가?

라고 생각할 수 있을 것이다. 그러나 ApplicationContext는 ActivityContext에서 제공하는 모든 것을 제공하지는 않는다.ApplicationContext로 GUI에 관련된 동작,
예를 들어 Resource에 접근하거나,Toast를 표시하는 등의 동작을 수행하게 될 경우 오류가 발생하게 될 가능성이 높다.

결론

GUI 등의 화면에 보여지는 동작을 수행하는 경우에는 ActivityContext를 주로 사용하고,
DB 등의 Activity가 종료되어도 수행되어야 하는 동작의 경우는 ApplicationContext를 사용하는 것이 바람직할 것이다.

참조

https://lakue.tistory.com/82
https://velog.io/@haero_kim/Android-Context-%EB%84%88-%EB%8C%80%EC%B2%B4-%EB%AD%90%EC%95%BC
https://velog.io/@oyunseong/Android-context%EB%9E%80
https://june0122.tistory.com/16

profile
안드로이드 3년차 개발자입니다.

0개의 댓글