[Android] Context, 적시 사용법(baseContext, applicationContext, this)

junsuPark·2022년 10월 19일
0

Android

목록 보기
6/12
post-thumbnail

Context

안드로이드 개발을 하면서 this, baseContext, applicationContext 등의 여러 가지 형태의 Context를 메소드의 인자로 넘겨주는 것을 많이 보았을 것입니다.

Toast.makeText(this, "Toast", Toast.LENGTH_SHORT)

하지만 this의 자리에는 baseContext, applicationContext 등 여러 값이 들어갈 수 있습니다. 이러한 자리에 어떤 Context의 형식을 넣어줘야 할까요?

Context ?

Context

맥락, 문맥

위의 해석처럼 Application/Activity의 현재 정보, 흐름를 담고 있는 객체이며, 새로 생성된 객체에게 해당 실행 맥락을 제공합니다

  • Application, Activity 클래스는 Context를 상속받습니다
  • 시스템의 API(DataBase, SharedPreferences), 클래스, 리소스 등의 접근을 제공합니다

Context의 구분(종류)

Activity Context

실행중인 Activity의 맥락을 담고 있는 Context입니다

  • 해당 Activity와 수명 주기가 같고, Activity 내에서만 유효합니다
    • Activity가 시작될 때 생성되고, 종료될 때 소멸합니다

Application Context

Application의 맥락을 담고 있는 Context입니다

  • 싱글톤 객체입니다
  • Activity에서 Context로 제공을 요청합니다
  • 해당 Application과 수명 주기가 같고, Application 전역에서 유효합니다
    • Application이 시작될 때 생성되고, 종료될 때 소멸합니다

Context의 사용

앞서 잠깐 설명 했듯이, Intent, Toast 등 안드로이드의 여러 컴포넌트에서는 Context를 파라미터로 제공받습니다. 하지만 이러한 Context가 들어가는 자리에 적절하지 않은 Context를 사용한다면 메모리 누수가 발생할 수 있습니다. 예를 들어, Application Context를 참조하여 싱글톤 객체를 생성해야 할 때 Activity Context를 참조하여 생성하게 된다면, Garbage Collector가 Activity Context를 수거하지 못하여 메모리 누수가 발생합니다.

this = baseContext

Activity Context = this = getBaseContext()

this 또는 baseContext는 현재 Activity 자신을 가리킵니다

  • Activity의 수명 주기 내에서 수행하는 작업에 제공되는 Context로 적합합니다
    • Intent, Toast 등에서 사용하기 적합합니다
  • Dialog, Toast 등의 UI를 표시하는 작업이 가능합니다

applicationContext

Application Context = getApplicationContext() = getApplication()

applicationContext

  • Application의 수명 주기 내내 진행되는, 전역적인 작업 등의 Context로 적합합니다
    • ActivityViewModel 클래스를 상속받는 viewModel을 사용하는 경우, ViewModel의 수명 주기가 Activity의 수명주기보다 길기 때문에 사용할 수 있습니다
    • Activity에서 라이브러리를 초기화해야 할 경우 사용할 수 있습니다
    • Activity보다 수명 주기가 길기 때문에 Application Context를 사용한 작업이 진행된 후 메모리에서 Garbage Collection이 진행되지 않습니다
  • Dialog 등의 UI를 표시하는 작업은 비효율적이거나, 아예 불가능합니다
    • Dialog는 Activity의 수명 주기 내에서 충분히 처리할 수 있는 작업입니다
    • Toast는 표시할 수 있습니다

정리

Activity의 수명 주기 내에서 처리할 수 있는 작업, 예를 들어 Intent, Toast, Dialog 등의 작업은 this, baseContext와 같은 Activity Context를 사용하여 작업을 처리하고, ViewModel 등의 Application와 수명 주기를 공유하거나 단일 Activity의 수명보다 긴 작업을 하는 경우에는 Application Context를 사용하여 작업을 처리하여야 합니다.

참고 자료

0개의 댓글