본문 바로가기
공부/Android

Android - Context 완전 정복

by hhhello 2024. 7. 2.

Activity를 사용하거나 로컬DB나 리소스를 사용할때 등 언제 어디서든 등장하는 이 Context. Context를 잘못 사용하게 되면 메모리 누수와 같은 문제를 일으킬 수 있다. 따라서 Context의 정확한 개념을 알고 사용하는 것이 중요하다. 오늘은 Context가 하는 역할이 무엇인지 알아보자.

Android의 Context

Context는 앱 또는 액티비티의 현재 상태 정보를 얻기 위해 사용한다.

앱은 ApplicationContext, 액티비티는 ActivityContext에 대응된다.

ApplicationContext

ApplicationContext는 싱글톤이다. Application의 생명주기와 연결이 되고 Activity의 범위를 넘어 Context를 전달해야하는 경우 사용된다.

ActivityContext

Activity 내에서만 사용해야 하는 Context이다. Activity의 생명주기와 연결이 되어있다. Activity가 종료되면 Context도 사라진다.

당연히 ActivityContext는 Application에 종속적이기 때문에 Application이 종료되면 ActivityContext도 종료된다.

이러한 생명주기를 고려하지 않고 ActivityContext를 사용하면 메모리 누수가 발생할 수 있다.

그럼 각 Context는 언제 사용하나?

LocalDB, SharedPreferences, resource와 같이 Application레벨에서 전역적으로 사용해야 하는 경우 ApplicationContext를 사용해야 한다.

Toast, Dialog 등 Activity에만 종속되는 상황에서는 ActivityContext를 사용해야 한다.

Context를 사용할 때 주의할 점

메모리 누수가 발생하는 예를 들어보자.

Activity는 ViewModel을 갖고 있고 ViewModel은 LocalDB를 사용한다고 가정하자.(Activity → ViewModel → LocalDB)

이런 경우 LocalDB를 사용할때 Context가 필요할탠데 ViewModel에게 ActivityContext를 넘겨주게 되면 메모리 누수가 발생할 수 있다. LocalDB에서 처리 중일때 갑자기 Activity가 종료된다면? 그때 메모리 누수가 발생하는 것이다.

이런 경우에는 ApplicationContext를 사용해야 한다.

반면 Toast, Dialog같은 Activity에서 UI관련 작업을 해야 하는 경우에 ApplicationContext를 사용하게 된다면 메모리 누수가 발생할 수 있다. Activity는 Garbage Colletion이 가능하나 ApplicationContext는 앱이 살아있다면 같이 살아있기 때문에 메모리 누수가 발생하는 것이다.