본문 바로가기

안드로이드/알아두기

[안드로이드] context에 대하여

면접 일정이 잡혔다(무야호). 

서류 하나만으로 나를 만나보고 시간을 투자해주는 곳이기에 나도 기술면접 준비를 열심히 해야겠다. Hilt는 좀 나중에 정리를 해야겠다!

 

첫 시작은 context로 할 것이다. 항상 applicationContext, requireContext()를 열심히 하지만 정확히 어떤건지에 대한 정리가 한 번쯤은 필요할 것 같아서 정리를 해본다.

 

1. Context란?

Context란 한글로 풀어서 쓰면 맥락 이라는 의미이다. 그렇다면 이 맥락이라는 의미를 조금 더 쉽게 풀어서 쓰자면, 내가 어떤 말을 할 때 특정 단어를 언급한다고 가정해보자. 그리고 그 특정 단어는 현재 상황에 맞는 단어일 수 있고 아닐 수 있다. 이때 우리는 해당 단어가 '이 맥락에 어울린다', 혹은 '어울리지 않다' 라고 얘기한다. 이럴 때 쓰는 말이 맥락이다. 

 

그렇다면 좀 더 안드로이드 쪽으로 끌어다가 맥락이란 의미를 해석해보자. 안드로이드 환경에서는 결론적으로 어플리케이션을 실행시키는게 목적이다. 그리고 그 어플리케이션을 실행시키려면 객체들이 필요하며, 해당 객체들이 그 상황에 어울리는지 안어울리는지 상태를 알아야 하는데 Context가 바로 그 역할을 해준다. 다시 얘기하면, Context는 액티비티와 어플리케이션에 대한 정보를 얻기위해서 사용하는 것이다. 중요한 점들을 다시 되짚어 보자면 아래와 같다.

 

  • 어플리케이션에 대한 현재 상황을 알려준다.
  • 액티비티와 어플리케이션과 관련된 정보를 얻기 위해서 사용될 수 있다.
  • 리소스, 데이터베이스, Shared Preference 등과 같은 것들에 접근하기 위해서 사용된다.
  • 액티비티와 어플리케이션은 Context 클래스를 상속받는다.

 

이렇듯 Context는 안드로이드 개발에 있어서 어디에나 있으며, 어디에나 있는만큼 개발에 있어서 가장 중요하기도 하다. 다만 제대로된 방법으로 사용하지 않는다면, 메모리가 누수될 수 있기 때문에 적재적소에 사용할 줄 알아야 한다.

 

2. Context의 종류 2가지

  1. Application Context
  2. Activity Context

 

- Application Context

  • 싱글톤 패턴의 인스턴스이다.
  • getApplicationContext()를 통하여 액티비티에 접근할 수 있다.
  • Application의 생명주기에 묶이게 된다.
  • 생명주기가 현재 Context와 분리되어 있는데 Context가 필요하거나 액티비티 스코프를 벗어나 Context를 넘겨주려고 할 때 사용될 수 있다.
  • ex. 앱에서 싱글톤으로 오브젝트를 생성하는데 Context가 필요하다? 그렇다면 Application Context를 사용해야 한다. (단, Activity Context를 사용하면 메모리 누수가 발생하게 된다.)
  • ContentProvider의 getContext()는 Application Context로 치부된다.

 

- Activity Context

  • 액티비티에서 사용되는 Context이다.
  • 생명주기는 activity와 엮이게 된다. 이말인 즉 activity가 onCreate될 때 Create되고, onDestroy에서 Destroy된다.
  • 액티비티 스코프 내에서 Context를 넘겨주거나, 같은 Context여도 생명주기가 현재의 Context에 종속되어있는 Context가 필요로할 때 사용하게 된다.

출처 : https://blog.mindorks.com/understanding-context-in-android-application-330913e32514

  • MyApplication은 Application Context 밖에 없으니까 Application만 써야한다.
  • MainActivity1과 MainActivity2는 Activity Context와 Application Context 둘 다 있다. 그치만 가장 근접해 있는 Context는 Activity Context이다. (일단 내가 보기엔 Lifecycle이 Activity에 종속되어 있으니까 그런 너끰적인 너끰이다.)

 

3. 언제 어떤 Context를 사용해야 할까?

Application Class를 상속받은 MyApplication 클래스와, 싱글톤 패턴으로 만들어진 MyDB 클래스가 있다고 가정해보자. 그렇다면 MyDB 클래스에는 Context를 넘겨줘야 하는데 어떤 Context를 넘겨줘야할까?

 

아까도 말했지만 Singleton 패턴의 경우에는 Application Context를 넘겨줘야 한다. 물론 Activity Context를 넘겨줄 수 있지만, 메모리 릭킹이 발생할 수 있으니까 Application Context를 써야한다.

 

Toats 메시지, 다이얼로그 요런 UI 작업이나 Activity 내에서 뭔가 작업을 하려면 Activity Context를 써야 한다. 언제 쓸지 적재적소에 뭘 쓸지 잘 생각해 봐야겠다.

 

4. 그럼 언제 getApplicationContext()를 안써야 할까?

GUI랑 관련된 작업에 있어서는 Application Context는 좋은 판단은 아니다. Activity Context를 써서 뭔가를 만들었을 땐 Activity가 GC를 통해 플러싱이 된다면, Activity Context를 이용한 것도 플러싱이 된다. 반면에 Application Context를 써서 뭔가를 만들고 clean up을 하지 않으면, 메모리가 누수될 수 있다. 그래서 UI와 관련된 작업같은 것들은 Application Context를 쓰지 말아야 한다.

 

 

참조 : https://blog.mindorks.com/understanding-context-in-android-application-330913e32514 

 

Understanding Context In Android Application

What is Context? As there are different types of context in Android, we as an Android Developer often get confused about which context to use at which place. So let’s understand what are those, how to use those and when to use which one.

blog.mindorks.com