Android 객체 직렬화 - 데이터 객체 전달하는 방법 @Parcelize 구현
개요
Android 앱에서 Activity나 Fragment 간 데이터를 전달할 때 객체를 직렬화하는 작업은 필수적입니다.
기존 방식으로 Parcelable을 구현하려면, 여러 메서드와 로직을 직접 작성해야 했습니다.
그러나 Kotlin의 @Parcelize 어노테이션을 사용하면 이러한 작업을 매우 간단하게 처리할 수 있습니다.
1. gradle (app) parcelize 추가
@Parcelize를 사용하려면 다음과 같이 Gradle 설정이 필요합니다.
plugins {
id 'kotlin-parcelize' // 또는 id("kotlin-parcelize")
}
2. 사용자 객체 전달
@Parcelize를 사용하여 Parcelable 객체를 정의합니다.
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class User(
val id: Int,
val name: String,
val email: String
) : Parcelable
3. Intent 통해 데이터 전달하고 받기
3-1 Activity 간 데이터 전달하고 받기
// MainActivity.kt
val user = User(1, "Alice", "alice@example.com")
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("user", user)
startActivity(intent)
// DetailActivity.kt
val user = intent.getParcelableExtra<User>("user")
user?.let {
Log.d("DetailActivity", "ID: ${it.id}, Name: ${it.name}, Email: ${it.email}")
}
3-2 Fragment 간 데이터 전달하고 받기
// 데이터 전송
val user = User(1, "Alice", "alice@example.com")
val fragment = DetailFragment().apply {
arguments = Bundle().apply {
putParcelable("user", user)
}
}
// 데이터 수신
val user = arguments?.getParcelable<User>("user")
user?.let {
Log.d("DetailFragment", "Name: ${it.name}, Email: ${it.email}")
}
4. @Parcelize 사용 시 주의사항
- @Parcelize는 Kotlin 전용
- Kotlin으로 작성된 Android 프로젝트에서만 사용할 수 있습니다. Java에서는 사용할 수 없습니다.
- 모든 필드가 Parcelable 가능해야 함:
- 클래스 필드에 Parcelable로 변환할 수 없는 타입이 포함되어 있다면 에러가 발생합니다.
- 예: SparseArray, HashMap 등은 사용 시 주의가 필요합니다.
- 다른 버전과의 호환성:
- 직렬화된 데이터를 다른 앱 버전에서 읽어야 한다면, 필드 이름 변경이나 삭제 시 문제가 발생할 수 있습니다.