안드로이드 앱을 만들면서 우리가 사용하는 context에 대해서 정리해보고자 한다.
Toasts, Adapters, Intents, Inflaters, SharedPreferences, SystemServices 와 같이 사용하는 곳은 많지만,
정확히 뭘 위해서 필요하고, 왜 필요한지에 대해 잘 모른다.
Context란?
현재 사용되고 있는 어플리케이션의 글로벌 정보를 가지고 있는 인터페이스로, 안드로이드 시스템에서 구현을 제공하는 추상 클래스다.
이렇게 설명하면 말이 좀 어려울 수 있는데 단순하게 정리하면 어플리케이션의 여러 정보를 가지고 있는 객체라고 이해하면 쉬울 것이다.
이 말은 즉, Context는 어플리케이션 리소스와 시스템 서비스 등에 접근할 수 있는 메소드를 가지고 있다는 말이다.
- 어플리케이션의 현재 상태를 나타냄
- 액티비티와 어플리케이션의 정보를 얻기 위해 사용할 수 있음
- 안드로이드 시스템 서비스에서 제공하는 API(Resource, Database, SharedPreferences 등)에 접근하기 위해 사용할 수 있음
- 액티비티, 서비스, 어플리케이션 클래스는 Context 클래스를 확장한 클래스임
Context를 사용할 때 주의해야 할 점
context으로는 많은 작업을 할 수 있다. 위에서 설명한 것처럼 리소스에 접근하거나, DB에 접근하거나, context 클래스의 여러 메소드를 사용할 수 있다. 그렇기 때문에 더욱 조심해서 사용해야 한다. 잘못 사용한다면 메모리 누수 등의 문제로 이어질 수 있기 때문이다.
* 메모리 누수: 사용하지 않는 리소스가 메모리에서 해제되지 않고 계속 남아있는 것
- ViewModel 등에서 액티비티를 멤버 변수로 참조하는 경우
- non-static inner class로 선언된 Handler를 액티비티에서 사용하는 경우
- View를 static 변수로 선언하고 액티비티가 이를 참조하는 경우
- 싱글톤에서 액티비티를 참조하는 경우
메모리 누수에 관한 설명은 이 블로그에 상세하게 나와있다. 예제는 Java 코드지만 이해하는 데 어렵지는 않다.
Context의 종류
- Application Context
- Activity Context

위 사진과 같은 구조를 가진 어플리케이션이 있다고 하자.
하나의 앱엔 여러 개의 액티비티가 존재할 수 있는데, 여기서는 두 개의 액티비티가 존재한다.
여기서 Activity Context는 Main Activity Context, Sub Activity Context가 된다.
액티비티에서는 Application Context와 Activity Context를 모두 사용할 수 있다.
각 Context에 대해 더 자세하게 알아보자.
1. Application Context
- 싱글톤
- 액티비티에서 getApplicationContext()을 통해 액세스 할 수 있음
- 어플리케이션의 생명 주기에 연결
- 현재 context와 별도의 생명 주기를 가진 context가 필요하거나, 액티비티 범위를 넘어서는 context를 전달할 때 사용
예를 들어 어플리케이션에 싱글톤 객체를 생성해야하고, 해당 객체에 context가 필요한 경우에 Application Context를 사용한다.
여기서 Application Context가 아닌 Activity Context를 사용하게 된다면, 액티비티에 대한 참조가 유지되어 액티비티가 가비지 컬렉터에 수집되지 않아서 메모리 누수가 발생한다.
이해하기 쉽게 실제 예를 들어보자.
뷰모델에서 데이터 베이스에 접근하는 코드를 작성하는데, 데이터 베이스에 접근하기 위해 context가 필요한 상황
그래서 뷰모델에 Activity context 의존성을 주입한다.
데이터 베이스에서 데이터를 가져오는 시간 보다 액티비티가 먼저 종료된다고 가정해보자.
액티비티가 종료되면서 뷰모델에서 참조중인 Activity context에서 메모리 누수가 발생하게 된다.
메모리 누수가 발생하면 앱이 강제 종료된다.
이런 상황을 막기 위해 Application Context를 사용하는 것이다.
액티비티 생명주기와는 별개로 어플리케이션의 생명주기에 연결되어있기 때문에 위와 같은 상황을 막을 수 있는 것이다.
2. Activity Context
- this를 통해 액세스 할 수 있음
- 액티비티의 생명주기에 연결
- 액티비티 범위에서 context를 전달할 때 사용
예를 들어, 액티비티에 라이프사이클이 첨부된 객체를 만들어야 하는 경우, Activitiy Context를 사용할 수 있음
어떤 Context를 사용하면 될까?
위에서 설명한 것 처럼, Application Context와 Activity Context를 상황에 맞게 사용하면 된다.
액티비티 생명주기와 다른 생명주기를 따른다거나, 싱글톤 객체에서 context를 필요로 하는 경우 Application Context
토스트 메시지와 같은 UI 동작에 있어서 context를 필요로 하는 경우 Activity Context
이와 같은 UI 컴포넌트들은 액티비티 생명주기에 종속되기 때문이다.
그냥 모든 곳에서 Application Context를 사용하면 안 될까?
절대 안된다!
Application Context는 Activity Context가 지원하는 것들을 지원하지 않는 경우가 있기 때문에, GUI와 관련된 것들에 대해서는 Application Context가 정상적으로 동작하지 않을 수 있다.
Application Context를 활용한 객체를 메모리에서 해제하지 않고 있으면 메모리 누수가 발생할 수 있다.
액티비티는 생명주기에 따라 가비지 컬렉션이 가능하지만, 어플리케이션은 앱 프로세스가 살아있는 동안 계속해서 남아있기 때문이다.
따라서 Application Context는 조심해서 사용해야한다.
The Rule of Thumb
100% 확신할 순 없지만, 대부분의 경우엔 가장 가까운 context를 사용하면 된다
해당 참조가 해당 구성 요소의 생명주기를 벗어나지 않는 한 해당 참조를 안전하게 유지할 수 있다.
액티비티 또는 서비스를 넘어서는 개체에서 context에 대한 참조를 저장해야 한다면, 일시적으로라도 저장한 참조를 애플리케이션 컨텍스트로 전환하라.
정리
- context는 어플리케이션의 글로벌 정보를 가지고 있는 객체
- context엔 Application Context, Activity Context가 있다.
- 싱글톤 객체에서 필요로 하거나, 앱 전역에서 사용되거나, 액티비티보다 오래 지속해서 사용해야 하는 경우 Application Context
- 액티비티 내에서 사용, GUI 관련 작업의 경우 Activity Context
참고
https://outcomeschool.com/blog/context-in-android-application
Context In Android Application
In this blog, we will learn about the context in Android application.
outcomeschool.com
[Android/안드로이드] Context, 뭐하는 녀석인지 알고 사용하자!
Context란? 현재 사용되고 있는 애플리케이션(또는 액티비티)에 대한 포괄적인 정보를 지니고 있는 객체입니다. Application의 현재 상태를 나타냅니다. Activity와 Application의 정보를 얻기 위해 사용할
lakue.tistory.com
https://velog.io/@haero_kim/Android-Context-%EB%84%88-%EB%8C%80%EC%B2%B4-%EB%AD%90%EC%95%BC
[Android] Context, 너 대체 뭐야?
헷갈렸던 Context 개념 바로 잡기
velog.io
'Native App > 👽Android' 카테고리의 다른 글
안드로이드 네트워크 통신 라이브러리 Retrofit, OkHttp (2) | 2024.08.12 |
---|---|
Intent란 (0) | 2024.08.05 |
Kotlin을 사용하는 이유 (0) | 2024.07.26 |
Android 4대 컴포넌트 (0) | 2024.07.26 |
adb 명령어를 사용해서 안드로이드 기기 무선 페어링 (0) | 2024.07.06 |
댓글