Android Bundle
Android Bundle
Bundle은 안드로이드에서 Activity, Fragment, Service 등 컴포넌트 간 데이터를 전달할 때 사용하는 키-값(key-value) 데이터 구조입니다. Bundle은 데이터를 운영 체제가 프로세스 경계를 넘어 전송하거나 구성 변경(configuration changes) 시에도 보존할 수 있는 형태로 직렬화합니다. 안드로이드 애플리케이션에서 데이터 흐름과 상태 유지(state persistence)를 효과적으로 관리하려면 Bundle의 동작 원리와 한계를 정확히 이해해야 합니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
Bundle이란 무엇이며 데이터를 어떻게 저장하는지 설명할 수 있습니다.- 안드로이드 컴포넌트 전반에서
Bundle의 주요 사용 사례를 파악할 수 있습니다. Bundle의 크기 제한과 그로 인한 영향을 이해할 수 있습니다.- 인스턴스 상태 보존을 위해
Bundle을 올바르게 활용할 수 있습니다.
Bundle의 동작 원리
Bundle은 키-값 쌍으로 데이터를 저장하며, 키는 문자열이고 값에는 원시 타입(primitive type), 문자열, Parcelable 객체, Serializable 객체, 또는 중첩된 Bundle을 담을 수 있습니다. 내부적으로 ArrayMap을 사용하여 데이터를 저장하고, Parcel 메커니즘을 통해 직렬화를 지원합니다. 이 Parcel 메커니즘은 안드로이드가 Binder IPC를 통해 프로세스 경계를 넘어 데이터를 전송하는 핵심 수단입니다.
val bundle = Bundle().apply {
putString("user_name", "skydoves")
putInt("user_age", 30)
putBoolean("is_premium", true)
}
val name = bundle.getString("user_name")
val age = bundle.getInt("user_age")
각 put 메서드는 문자열 키 아래에 값을 저장하고, 대응하는 get 메서드로 값을 꺼냅니다. 저장할 때와 읽어올 때 타입이 반드시 일치해야 합니다. 만약 문자열이 저장된 키에 getInt를 호출하면 예외가 발생하지 않고 기본값이 반환되므로, 타입 불일치를 런타임에서야 알 수 있다는 점에 유의해야 합니다.
Bundle은 배열, Parcelable 리스트, 중첩된 Bundle 객체도 저장할 수 있어 다양한 형태의 데이터를 담기에 충분합니다. 다만 컴파일 타임에 타입 검사가 이루어지지 않기 때문에 키 이름 오타나 타입 불일치가 런타임에서야 발견됩니다. 이러한 오류를 방지하려면 키 이름을 상수로 정의하고, 특정 타입을 읽어오는 확장 함수를 만들어 활용하는 것이 좋습니다.
지원하는 타입
Bundle이 저장할 수 있는 전체 타입 목록은 다음과 같습니다. Boolean, Byte, Char, Short, Int, Long, Float, Double, String, CharSequence, Parcelable, Serializable, Bundle, 그리고 대부분 타입의 배열 또는 ArrayList 변형까지 포함합니다. 각 타입에는 전용 put과 get 메서드 쌍이 제공됩니다.
Activity 간 데이터 전달
Intent로 Activity를 시작할 때 putExtra()를 통해 데이터를 첨부하면, 해당 값은 Intent 내부의 Bundle에 저장됩니다.
val intent = Intent(this, DetailActivity::class.java).apply {
putExtra("article_id", 42)
putExtra("article_title", "Kotlin Coroutines")
}
startActivity(intent)
// DetailActivity에서 데이터 수신
val id = intent.getIntExtra("article_id", -1)
val title = intent.getStringExtra("article_title")
extras Bundle은 Intent와 함께 시스템을 통해 전달되며, 대상 Activity의 onCreate() 메서드에서 접근할 수 있습니다. 타입 안전성을 높이려면 원시 문자열 키 대신 Kotlin 확장 프로퍼티나 Navigation 컴포넌트의 Safe Args 플러그인을 사용하는 것을 권장합니다. 이렇게 하면 키 이름 불일치나 타입 캐스팅 오류를 사전에 방지할 수 있습니다.