Context란?
Context는 애플리케이션의 환경에 대한 전역정보가 컨텍스트로 연결됩니다. Context는 Android 시스템에 의해 제공되는 추상 클래스로 애플리케이션 별로 리소스 및 클래스에 대한 접근은 물론 Activity의 실행, 브로드 캐스팅 및 Intent 수신과 같은 애플리케이션 레벨에 대한 호출을 허용합니다.
말이 조금 어려운데 간단하게 말하자면 Context는 안드로이드 앱의 실행 환경에 대한 정보를 제공하는 클래스입니다. 안드로이드 앱은 Context를 사용해 다양한 작업을 수행하고, 시스템 서비스에 접근하며, 리소스에 액세스할 수 있습니다.
안드로이드에서는 앱의 실행 환경이 다양한 상황과 조건에 따라 변경될 수 있습니다. 이러한 실행 환경을 표현하고 조작하기 위해 Context 클래스가 사용된니다. Context는 앱의 상태와 리소스에 대한 액세스를 가능하게 합니다.
Application Context
Application Context는 애플리케이션에 단 하나만 존재하는 싱글톤 Context이다. getApplicationContext()를 통해 Activity에 접근할 수 있는 인스턴스이다.
어떤 싱글톤 객체를 만들어야 하고 해당 객체에 항상 Context가 필요한 경우에 Application Context를 전달하면 된다. 다만 Activity를 참조하게 되면 Activity가 없어지더라도 참조가 유지되므로 메모리 누수가 발생할 수 있다. 그러므로 가장 오래 유지할 Context가 필요할 때만 getApplicationContext()를 사용하는것이 좋다.
Activity Context
Activity Context는 Activity의 생명주기와 관련이 있다. 액티비티가 부서지면 Context도 같이 부서지게 된다. 액티비티의 사용자 인터페이스에 대한 접근, 액티비티 관련 작업에 사용된다.
Activity Context는 Application Context보다 더 많은 메모리를 소비하고, 액티비티 생명주기에 영향을 받으므로 사용 시 주의가 필요하다.
두 유형의 Context는 각각 다른 사용 사례와 제약 사항을 가지고 있으므로, 상황에 맞게 사용해야 한다. 일반적으로 앱 전체적인 작업이나 앱 설정과 같은 공통 작업에는 Application Context를 사용하고, 액티비티와 관련된 작업에는 Activity Context를 사용하는 것이 권장된다.
Context는 슈퍼 클래스이다.
아래의 그림을 한번 보면 Context가 Activity, Service, Application의 슈퍼 클래스인 것을 확인할 수 있습니다.
이 것이 Activity, Service, Application들이 Context를 가지는 이유입니다.
우리가 안드로이드 앱을 개발하다 보면 context가 필요한 경우에 this를 넣는 경우를 많이 봐왔을 것입니다.
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// "this"를 사용하여 현재 액티비티의 Context에 접근
val context: Context = this
// Toast 메시지를 사용하여 Context 활용 예시
val message = "Hello, this is a Toast message!"
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}
this는 MainActivity 클래스의 객체를 나타내는데 this로 context에 접근하고 있습니다. 이것이 가능한 이유가 바로 Activity 클래스가 Context 클래스의 하위 클래스 이기 때문입니다.
Activity 내에서 this를 사용하면 현재 액티비티 객체와 그에 연결된 context를 의미하게 됩니다.
Fragment의 Context
Fragment의 context는 해당 Fragment가 속한 액티비티의 실행 환경에 대한 정보를 제공합니다. Fragment가 onAttach() 메서드에서 액티비티에 붙을 때 context가 설정됩니다. 다만, onAttach() 이전에 context를 사용하려고 하면 NullPointerException이 발생할 수 있습니다.
그렇기에 일반적으로 Fragment 내에서 context를 사용하려면 requireContext() 메서드를 호출하여 가져옵니다. 이 메서드는 Context 타입을 반환하며, Fragment가 속한 액티비티의 실행 환경에 대한 참조를 제공합니다.
Reference
'Android' 카테고리의 다른 글
작업 및 백 스택 이해 (0) | 2023.08.04 |
---|---|
Android의 Intent (인텐트) (0) | 2023.07.23 |
안드로이드의 앱 구성요소 (4대 컴포넌트) (0) | 2023.07.11 |
[Android] Fragment Life Cycle (프래그먼트 생명주기) (0) | 2023.06.13 |
[Android] Activity Life Cycle (액티비티 생명주기) (1) | 2023.06.13 |