이번 포스팅에서는 Context에 대해 정리해본다.
✅ Context 란?
사전적 의미로는 맥락, 문맥 등이다.
안드로이드에서의 Context 또한 비슷한 의미로 사용된다고 느낄 수 있다.
앱이 흘러가는 맥락으로 볼 수도 있고, 앱의 현재 상태로 볼 수도 있다.
● Context 사용처
- 시스템 서비스에서 제공하는 API를 사용하기 위해
- 시스템 입장에서는 앱의 정보 또는 액티비티의 정보를 얻기 위해
● Context 종류
- Application Context
- Activity Context
*Application, Activity 2개의 클래스 모두 Context 클래스를 상속한다.
Context가 필요한 상황에서,
위 2개의 Context 중 어떤 것을 사용해도 무방한 경우가 있었을 것이다.
하지만 Context의 용도를 분명히 해야 한다.
각 Context에 대해 짚어보고 그 이유를 알아보자.
✅ Application Context
Kotlin 기준, applicationContext 키워드로 얻을 수 있는 Context다.
*Java는 getApplicationContext()
싱글톤 인스턴스이기 때문에 앱 기준 1개만 존재한다.
그렇기에 앱 내에서 싱글톤으로 사용되는 객체에 Context가 필요하다면 잘 어울린다고 볼 수 있다.
대표적인 예시로는 Database, SharedPreferences 등
전역적으로 사용되는 리소스를 초기화할 때 사용할 수 있겠다.
✅ Activity Context
Activity 마다 존재하는 Context다.
그렇기에 액티비티 스코프 내에서 사용하거나,
액티비티와 생명주기를 함께하는 객체에 사용해야 한다.
액티비티 내에서는 흔히 this 키워드로 많이 접해봤을 것이다.
위 처럼 Activity Context는 액티비티 상태 · UI 관련 요소 등이 포함된 객체에 사용된다.
✅ Context 용도가 올바르지 않다면?
● Application Context 사용처에 Activity Context를 사용했을 때
앱 전역에 존재하는 싱글톤 객체에 Activity Context를 사용하게 된다면,
해당 Activity가 종료되었지만 싱글톤 객체는 살아있는 케이스가 발생한다.
그렇게 되면 Activity Context에 대한 참조는 유지되기 때문에
GC가 수집하지 못하는 상황이 발생하게 된다.
즉, 해당 Activity는 종료된 것처럼 보이더라도
제대로 소멸되지 못한 상태로 메모리 누수가 발생하게 된다.
● Activity Context 사용처에 Application Context를 사용했을 때
Activity Context는 액티비티의 상태 · 테마 · 스타일 · 레이아웃 등에 접근할 수 있는 정보를 제공한다.
반면 Application Context는 해당 Activity와 관련된 정보를 알지 못한다.
그렇기에 Application Context를 사용했을 때 예기치 못한 에러를 종종 만나볼 수 있다.
● startActivity()
val intent = Intent(Context, SecondActivity::class.java)
startActivity(intent)
새로운 액티비티를 생성하려고 할 때 Application Context를 사용한다면,
시스템은 어떤 액티비티를 기반으로 새로운 액티비티를 시작해야 하는지 알 수 없다.
그렇기에 새로운 Task를 분리하여 액티비티를 생성하게 되고,
추후 멀티 태스크와 관련된 이슈에 노출될 가능성이 생긴다.
● Dialog
val dialog = AlertDialog.Builder(Context)
마찬가지로, 다이얼로그 또한 UI 요소이기 때문에 Application Context를 사용하면
다음과 같이 IllegalStateException 예외를 마주하게 된다.
Context는 안드로이드 개발을 시작함과 동시에 마주하는 개념이다.
진작에 포스팅했던 줄 알았는데,,, 없어서 이제야 정리한다.
'Android (안드로이드)' 카테고리의 다른 글
[Android] DrawerLayout / 서랍장 화면 (0) | 2025.01.15 |
---|---|
[Android] Snackbar / 스낵바 사용해보기 (2) | 2025.01.14 |
[Android] DownloadManager / HTTP 통신으로 파일 다운로드하기 (0) | 2025.01.10 |
[Android] View에 Ripple 효과 적용하기 / 버튼 눌리는 애니메이션 (1) | 2024.12.29 |
[Android] 텍스트 ... 표시 / 텍스트 말줄임 표시 (1) | 2024.12.28 |