Context 란?

지프치프·2021년 7월 1일
0

Android

목록 보기
1/85
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


Context?

직역하면 '맥락'이란 뜻인데, 안드로이드를 잠깐이라도 써 본 사람들은 쉽게 들어봤을 것이다.
당장 많이 사용되는 Toast에서도 첫 매개변수로 Context를 요구한다.

Toast.makeText(context, message, duration).show()
AlertDialog.Builder(context).create()

가장 흔하게 많이 쓰이는 경우가 아닌가 싶다

그렇다면 이 Context는 정확히 무엇일까?

먼저 구글 문서를 참고해보면...


영어가 짧은 관계로 번역기의 힘을 빌려보겠다

애플리케이션 환경에 대한 글로벌 정보에 대한 인터페이스입니다. Android 시스템에서 구현을 제공하는 추상 클래스입니다. 이를 통해 애플리케이션 별 리소스 및 클래스에 액세스 할 수있을뿐만 아니라 활동 시작, 인 텐트 브로드 캐스트 및 수신 등과 같은 애플리케이션 수준 작업에 대한 상향 호출도 가능합니다.

구글 문서에 의하면 Context는 Android에서 구현을 도와주는 추상클래스의 형태로 제공되며
이를 활용하여 리소스 및 클래스에 접근하거나 애플리케이션 수준에서의 작업을 가능하게 해준다고 나와있다.

그 외에도 액티비티의 정보(현재 상태)를 얻기 위해서 사용되기도 한다.

Context에는 2가지 종류가 있다

  • Application Context
    - 싱글톤 인스턴스
    - 애플리케이션의 생명주기에 귀속됨
    - Activity의 범위를 넘어서 Context를 전달할 때 사용
    - getApplicationContext()로 접근
      
  • Activity Context
    - Activity에서 사용가능한 Context로 액티비티 생명주기에 귀속됨
    - Activity 범위 내에서 Context를 전달하거나, 현재의 Context를 전달
    - getContext()로 접근

Context를 요구하는 클래스를 사용할 때는 어떤 Context를 요구하는지
잘 파악하고 사용해야한다.
이를테면 Activity Context를 요구하는데 Application Context를 사용하면
Activity의 생명주기가 끝나서 종료되어도 Application Context는 메모리에 그대로 남아서
메모리 누수가 발생할 수도 있기 때문이다.

번외로,

Fragment나 RectclerViewAdapter 등 Context를 기본적으로 제공하지 않는 곳이 있다.

  • fragment는 기본적으로 getContext()를 제공하여 context를 쉽게 가져올 수 있다. 다만 fragment가 완전히 attach되지 않아 context를 null로 반환할 수 있기 때문에 안전한 context 사용은 아래와 같이 사용하면 된다. 자세한 글은 여기를 참조 바란다.

Fragment는 생명주기 중 onAttach()를 오버라이딩하면 인자로 context를 받아온다.
RecyclerViewAdapter는 onCreateViewHolder 메소드에서 인자로 받아오는
parent(viewGroup)에서 context를 가져올 수 있다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글