[번역] 안드로이드 Context(컨텍스트)이해하기

이현우·2020년 12월 18일
0

Deep Dive: Android

목록 보기
1/10
post-thumbnail

안드로이드 어플리케이션의 Context(컨텍스트) 이해하기

안드로이드에서 Context란?

Context는 말 그대로 안드로이드에서의 "Context(문맥, 맥락)"이라고 생각하면 된다. Context는 몇 가지 중요한 특징을 가지고 있다.

Context는

  • Application의 현재 상태에 대한 맥락이다
  • Application/Activity에 관련된 정보를 얻을 수 있다
  • Resources/DB/SharedPreferences에 접근할 때 사용되기도 한다
  • Application/Activity의 부모 클래스이다

Context는 안드로이드 개발의 대부분에서 찾아볼 수 있고 가장 중요하게 고려해야할 부분 중 하나라고 생각할 수 있다. 그래서 안드로이드 개발자들은 Context를 이해하고 프로그래밍을 해야할 필요가 있다.

그리고 Context를 잘못 사용할 시 어플리케이션에서 메모리 누수가 발생할 수 있다.

안드로이드 개발자라면 어떤 위치에 어떤 Context를 대입해야할 지 헷갈리는 경우가 많다. 그래서 이번 게시글에서는 Context를 어떻게/언제 사용해야 하는 지 이해해보는 시간을 가질 것이다.

자주 사용하는 Context에는 두 가지 종류가 있다

  • Application Context: Application에 관한 정보를 담은 Application단의 Context
  • Activity Context: Activity 관한 정보를 담은 Activity단의 Context, Activity마다 존재한다

Application Context

Singleton 객체로 존재하고 Activity에서 getApplicationContext라는 함수를 통해 접근할 수 있다. 코틀린에서는 Activity에서 applicationContext라는 변수를 통해 접근이 가능하다. 이 Context는 어플리케이션 단의 생명주기와 바인딩 되어있다.

Application Context는 현 상태(Activity)의 Context와 분리 된 상황에 사용할 수 있다. 예를 들어 Application단에 Context가 필요한 Singleton 객체를 생성할 때, application context를 대입하면 된다. 만약 이 객체에 activity context를 대입한다면, application이 유지되는 동안 activity에서 참조가 계속 발생하고 그렇다면 activity는 가비지 콜렉팅이 되지 않아 메모리 누수가 발생하게 된다. 따라서 Activity에서 라이브러리르 초기화하는 경우 Application Context를 활용하는 것이 좋을 것이다.

한 가지 예를 들자면, Room에서 초기화를 할 때 context가 필요한데, 이때 Room은 전체 프로젝트에서 지속적으로 사용해야하는 Singleton 객체니, Application Context를 대입하는 것이 좋을 것이다.

Activity Context

이 Context는 Activity에서 사용가능하다. 당연히 Activity의 생명주기와 바인딩이되어있다. 위에서와 마찬가지로 Activity의 생명주기와 동일시되는 Context가 필요할 때 사용하면된다.

예를 들어 Activity에서 사용되는 Dialog, Toast 등 UI 작업에 필요한 Context는 Activity Context를 사용하면 된다.

즉, Singleton 객체나 Application에서 초기화하는 객체일 경우 Application Context를, Activity엣 사용되는 UI 컨트롤러 객체들은 Activity Context를 사용하는 것을 권장한다.

The Rule of Thumb

대부분의 경우에는 현재 상황에 맞는 컨텍스트를 참조하면 된다. 이 참조가 현재 상황(Activity 등)의 생명주기에 넘어서지 않는 지만 판단해서 대입하면 된다. 만약, Activity나 Service 이외의 컴포넌트/객체에서 Context 참조가 필요할 경우, Application Context로 참조하는 것을 강력히 권장한다.

원문

profile
이현우의 개발 브이로그

0개의 댓글