정답보다 해답을

[Android] Context, 알고 쓰자 본문

Android

[Android] Context, 알고 쓰자

DOLMENG. 2024. 10. 31. 01:10

안드로이드 개발에서 Context는 앱의 현재 상태와 전반적인 환경 정보를 담고 있는 중요한 역할을 합니다. 이번 포스팅에서는 Context의 종류와 사용법을 정리해 보겠습니다. 이를 통해 올바른 Context 사용을 통해 메모리 누수를 방지하고 앱의 안정성을 높일 수 있습니다.


1. Context란? 🤔

Context는 안드로이드 애플리케이션의 현재 상태와 전반적인 환경 정보를 담고 있는 추상 클래스입니다. Context는 앱에서 리소스, 데이터베이스, 시스템 서비스 등에 접근할 수 있도록 "맥락"을 제공합니다.


2. Context의 종류 📑

안드로이드에서 Context는 여러 유형으로 나뉩니다. 각 유형은 사용 목적에 따라 적합한 작업이 다르므로 상황에 맞는 Context를 사용해야 합니다.

2.1 Application Context

  • 사용법:
  • val appContext = getApplicationContext() // 또는 val appContext = applicationContext
  • 특징
    • 애플리케이션의 수명 주기와 연결되어 있고, 싱글톤 인스턴스로 제공됩니다.
    • 메모리 누수의 위험이 적어 장기적인 리소스 접근에 적합합니다.
    • 다만 UI 관련 작업에는 적합하지 않습니다.

2.2 Activity Context

class MainActivity : AppCompatActivity() {
    fun showDialog() {
        AlertDialog.Builder(this) // Activity Context 사용
            .setMessage("메시지")
            .show()
    }
}
  • 특징
    • Activity 수명주기와 연결되어 있습니다.
    • UI 작업에 적합하여 View 생성이나 Dialog 표시 등에 주로 사용됩니다.

2.3 Fragment Context

Fragment는 자체 Context를 가지지 않으며, 항상 부모 Activity의 Context를 참조합니다.

  • 특징
    • Activity의 생명주기에 종속되어 부모의 Context를 사용하는 방식입니다.

2.4 Fragment Context 사용 방법

getContext()

class MyFragment : Fragment() {
    fun showToast() {
        context?.let { ctx ->
            Toast.makeText(ctx, "메시지", Toast.LENGTH_SHORT).show()
        }
    }
}

requireContext()

class MyFragment : Fragment() {
    fun showDialog() {
        AlertDialog.Builder(requireContext())
            .setMessage("메시지")
            .show()
    }
}
  • Fragment Context 활용 가이드 💡
    • UI 작업에는 requireContext() 사용
    • Nullable 상황에서는 getContext()와 null 체크를 함께 사용
    • 장기적인 리소스 참조가 필요하다면 ActivityapplicationContext를 사용하는 것이 좋습니다.
    • onAttach()onDetach()에서 생명 주기를 고려하여 사용합니다.

3. 올바른 Context 사용법 ✅

3.1 Application Context 사용 시점

  • 싱글톤 객체 생성
  • 앱 전역 라이브러리 초기화
  • Activity 범위를 넘어서는 장기 작업

3.2 Activity Context 사용 시점

  • UI 관련 작업 (Dialog, Toast 등)
  • View 생성 및 조작
  • LayoutInflater 사용 등 UI가 연관된 작업에 적합

3.3 주의사항 ⚠️

잘못된 Context 사용은 메모리 누수를 초래할 수 있으므로, 상황에 맞는 Context를 사용하는 것이 중요합니다.

  • 잘못된 사용 예시
  • class MySingleton { private lateinit var context: Context // Activity Context 참조 }
  • 올바른 사용 예시
  • class MySingleton { private lateinit var context: Context fun init(context: Context) { this.context = context.applicationContext // Application Context 사용 } }

4. Context 사용 규칙 📋

  1. GUI 작업은 반드시 Activity Context를 사용
  2. 수명주기가 긴 객체Application Context를 사용
  3. Static 변수 또는 메서드에서는 Application Context만 사용
  4. 항상 가장 가까운 범위의 Context를 사용 (예: Activity 내부에서는 Activity Context)