티스토리 뷰

Context는 무엇인가

  • 애플리케이션의 현재 상태에 대한 문맥이다.
  • application 혹은 activity의 정보를 가져올 수 있다.
  • resource, database, shared preference 등에 접근할 수 있다.
  • Application, Activity 클래스는 모두 Context 클래스를 상속받는다.

 

안드로이드 개발을 한다면 수도없이 마주치는 Context. 기본적인 부분이지만 잘못사용하면 앱의 메모리 누수를 야기시킬 수 있다. Context를 사전에서 검색해보면 우리말로 '문맥' 혹은 '전후사정'이라는 말에 해당된다. 바꿔말하면 이야기 전체 흐름 안에서 현재 오고가는 주제라고 할 수 있겠다.

 

하나의 대화를 예로 들어보자. 이야기의 흐름은 국회의원선거로 시작이 되었다. 이것이 전체 문맥에서 가장 큰 흐름이 될 것이다. 그 안에서 여러 이야기들이 오고 간다. 내가 지지하는 당선인 혹은 정당에 대한 이야기를 하다가 국회의원 선거 투표에 대한 이야기로 넘어갈 수도 있다. 이것들은 큰 흐름 안에 있는 작은 흐름이 될 것이다. 그런데 이 이야기를 하다가 갑자기 군대이야기가 나온다면 이야기의 흐름이 깨진다. 문맥에 맞지 않는 것이다. 한 두번이야 있을 수 있지만 대화가 그런식으로 이어진다면 그것은 문맥없는 대화가 되고 일반적인 사람이라면 대화의 흐름 속에서 혼란을 느낄 것이다.

 

그렇다면 안드로이드 개발의 관점에서 문맥은 무엇을 의미할까. 앱의 흐름은 뭘까. 스레드가 아닐까? 하나의 애플리케이션(프로세스) 안에는 여러 스레드가 생성되고 흐름을 가진다. 여기서도 마찬가지로 가장 핵심이 되는 기본 흐름 있고 그 안에서 생성되었다가 사라지는 여러 작은 흐름들이 있다. 가장 큰 흐름은 당연히 application 이다. 그리고 그 흐름 안에 activity를 비롯한 다른 여러 흐름들이 생성되었다가 사라지거나 한다.

 

안드로이드에서 가장 주요한 두 개의 Context는 아래와 같다.

  • Application Context: 현재 진행되고 있는 애플리케이션 안에 있음을 의미한다. 예를 들어 현재 앱이 MyApplication이라면 이는 Application 클래스를 상속받고 있으며, 단 하나의 인스턴스를 가리킨다. 위의 그림에서는 <국회의원 선거>라고 할 수 있겠다.
  • Activity Context: 현재 액티비티 안에 있음을 의미한다. MainActivity라면 이것의 인스턴스를 가리킨다. 위의 그림에서는 작은 문맥 중 하나에 해당한다.

 

Application Context

애플리케이션 컨텍스트는 getApplicationContext() 메서드를 호출해서 접근할 수 있다. 애플리케이션의 생명주기에 종속되어 있기 때문에 현재 컨텍스트의 생명주기와 상관없는 컨텍스트가 필요하거나 액티비티 너머로 컨텍스트를 전달할 필요가 있을 때 사용한다. 

 

예를 들면 싱글톤 객체를 생성해야 하는데 컨텍스트가 필요한 상황이라면 이 때는 필히 애플리케이션 컨텍스트를 전달해줘야 한다. 만약 이 때 액티비티 컨텍스트를 전달한다면 액티비티가 종료된 이후에도 계속해서 액티비티를 참조하기 때문에 GC의 수거대상이 되지 못하고 메모리 누수의 원인이 될 수 있다. 

 

ViewModel안에서 컨텍스트를 사용해야 할 경우에는 AndroidViewmodel 클래스를 상속하면 되는데, 이때 사용하는 컨텍스트도 application 컨텍스트이다. 이유는 뷰모델의 생명주기가 액티비티보다 길기 때문이다. 

class MyViewModel(application: Application) : AndroidViewModel(application) {

    // you can use application context
    private val db = PlaceDb.getInstance(application)
}

 

액티비티 안에서 라이브러리를 초기화해야 하는 경우에도 애플리케이션 컨텍스트를 전달해야 한다. 

 

Activity Context

Activity 컨텍스트는 액티비티 안에서 접근이 가능하며, 액티비티 생명주기에 종속되어 있다. 따라서 현재 액티비티의 생명주기 범위 안에서 컨텍스트를 전달할 필요가 있는 경우에만 사용해야 한다. 

 

예를 들어 액티비티 생명주기 안에서 객체를 생성하는데 컨텍스트가 필요한 경우라면 액티비티 컨텍스트를 사용하면 된다. UI와 관련된 동작들, 이를테면 toast, dialog 등이 그에 해당된다.

출처: MindOrks

하나의 앱의 계층구도는 위와 같다. 포스트 초반에 비유로 든 그림과 비슷하다. 

 

요약

Application Context

  • 앱의 생명주기에 종속되어 있다. 함부로 사용하면 안된다.
  • 잘못 사용하면 메모리 누수를 일으킬 수 있다.
  • 현재 컨텍스트의 생명주기 넘어서는 범위에서 컨텍스트가 필요한 경우에만 사용한다.
  • 라이브러리 초기화 혹은 싱글턴 객체에 컨텍스트를 전달하는 경우를 예로 들 수 있다.

Activity Context

  • 액티비티 범위 안에서 동작이 끝나는 작업을 할 때 사용한다.
  • GUI와 관련된 작업에 컨텍스트가 필요한 경우를 예로 들 수 있다.

이 포스팅은 MindOrks의 글을 참고했다.

댓글