반응형

개발을 하다 보면 실행하려는 라이브러리 함수에 Context를 파라미터 값으로 받아갈 때가 굉장히 잦았다. 하물며 토스트 메시지를 띄우려 할 때도 가져간다. 안드로이드 개발 공부를 시작하고 얼마 안 됐을 때는 대부분 화면과 관련된 곳에서 많이 사용되길래 단순하게 그려지는 화면인가 보다 했지만 계속해서 개발 공부를 하면서 보니 꼭 그렇지만은 않다는 걸 깨달았다. 특히 이번 포트폴리오 프로젝트를 개발하면서 Service나 MVVM 패턴 등을 처음 접해서 사용하다 보니 LiveData로 UI나 데이터를 최신화시키는 작업을 많이 했었는데, 라이브 데이터에 옵저버를 걸어줄 때도 Context가 필요한 걸 보고,

 

대체 Context 라는건 뭘까?
 

하는 궁금증이 생겨 알아보았다.


https://developer.android.com/reference/android/content/Context

 

Context  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

여기저기 검색해서 찾아다니다보니 사전적 정의부터 설명해주는 곳들이 꽤 있던데 솔직히 크게 도움은 되지 않아 생략한다. (필요하신 분들을 위해... 사전적 정의는 '맥락'이라는 뜻이라고 합니다.)

안드로이드 공식 문서에 설명을 단순하게 이해하면 '어플리케이션의 현재 상태를 나타내는 인터페이스'라는 것 같다. 개발하는 입장에서 본다면 어플리케이션의 Activity, API 등의 정보에 접근하는 데에 사용하는 녀석이다.

 

 

개발 중에 Context가 필요할 때 사용하다보니까 알게 된 사실 중 Activity 클래스에서 Context가 필요하면 'this'로 사용하면 되지만 Activity가 아닌 다른 클래스 (나의 경우엔 Service 클래스나 Foreground 클래스 등)에서 Context가 필요할 때는 검색으로 알아내서 사용했던 'ApplicationContext'를 사용했었다. 그렇다면 Context는 한 가지가 아닌 것 같은데으로 보이는데 이 둘은 무슨 차이가 있을까?

 

 

 

https://velog.io/@haero_kim/Android-Context-%EB%84%88-%EB%8C%80%EC%B2%B4-%EB%AD%90%EC%95%BC

 

[Android] Context, 너 대체 뭐야?

헷갈렸던 Context 개념 바로 잡기

velog.io

Context는 크게 'Application Context'와 'Activity Context'로 나뉜다고 한다.

'Application Context'는 이름처럼 어플리케이션의 생명 주기에 따른다고 한다. 때문에 Activity 범위를 벗어난 곳이나 전역에서 사용될 곳에서 사용하면 되는 싱글톤 객체이다.

'Activity Context'도 이름처럼 액티비티의 생명 주기에 따른다. 때문에 해당 액티비티가 소멸하면 같이 소멸하게 된다,

 

알아보고 나니 또다시 궁금한 점이 생겼다.

 

그냥 편하게 모든 곳에서 Application Context를 가져다 사용하면 되는 것 아닌가? 
 

당연하게도 나눠놓은 이유가 있겠지 싶었고, 이는 Context에 대해 알아보러 돌아다니다 보니 쉽게 이유를 알 수 있었다.

 

'Application Context'는 설명에서 처럼 싱글톤 객체이다. 이는 즉, 특정 액티비티나 클래스가 파괴된다고 해서 사라지는 것이 아니고 처음 싱글톤 클래스가 로딩될 때 생성되어 메모리 영역을 할당받는다. 싱글톤은 간단하게 말하면 불필요한 여러 개의 인스턴스 생성을 막기 위해 단 하나의 인스턴스만을 가지고 사용하는 패턴(방식)인데, 이런 곳에 사용하는 Context라고 한다.

왜냐? 싱글톤 객체는 처음에 클래스 로더에 의해 생성되는데 여기에 Activity Context를 넣게 되면 해당 Activity 생명주기에 의해 소멸되는 순간이 올 텐데 그렇게 되면 Context도 소멸하기 때문에 이후에 싱글톤 객체를 사용하려면 Context가 없어졌기 때문에 또 생성시켜야 하고 이는 싱글톤 객체를 사용하는 이유와 전혀 맞지 않기 때문이다. 또한 Activity와 다르게 Application은 GC(가비지 컬렉션)에 의해 메모리 해제되지 않는다고 한다. 그러니 불필요하게 남아 메모리 릭을 발생할 수 있다.

 

그렇기에 'Activity Context'는 전역이 아니며, 해당 액티비티에서만 사용되는 곳에서 사용해주면 된다. 보통은 Activity의 UI에 사용되는 곳 정도인 것 같다.

 

 

 

 

 

Toast 함수를 사용하려면 파라미터 값으로 'context'가 필요하다.

Context라는 녀석이 어떤 건지는 대충 알겠다. 그렇다면 개념 체크 겸 추가로 기억에 나는 궁금증이 더 있다. 흔히 개발 중에 Activity 클래스에서 Intent나 Toast에 파라미터 값으로 'packageContext' 나 'context'를 전달시켜줘야 할 때가 빈번했는데, 이럴 땐 보통 파라미터 값에는 'this'라고 적어주고 끝냈었다. 'this'라고 적어주면 알아서 파라미터에 해당되는 걸 가져가길래 신경 쓰지 않았었는데, 저 'this'는 어떤 Context를 가져가는 걸까?

 

 

this는 ActivityContext 이구나

로그로 확인해본 결과 Activity 클래스에서 함수들에 'this'라는 이름으로 전달해주던 Context는 'Activity Context'였다. 위에서 이해했던 게 맞아 보인다.

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기