개발
TIL: parcelable
kks950115
2023. 12. 27. 21:15
728x90
액티비티 간에 데이터를 string, int, long 등 다양하게 넘겨줄 수 있지만 객체를 전해줘야할 수도 있다.
그럴 때는 parcelable을 사용하여 준다. 비슷한 역할을 하는 serializable 도 있다.
성능을 비교하면
parcelable >>> serializable
parcelable이 훨씬 나중에 나왔기 때문에 더 최신의 기술이고 그만큼 성능 역시 좋다. 하지만 serializable을 쓴다고 한다.
왜일까?
parcelable 은 추상메소드이므로 하나하나 다 오버라이드를 해줘야한다.
import android.os.Parcel
import android.os.Parcelable
class MyParcelableObject(val name: String, val age: Int) : Parcelable {
// 생성자
constructor(parcel: Parcel) : this(
parcel.readString() ?: "",
parcel.readInt()
)
// 객체를 Parcel로 쓰는 메서드
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(name)
parcel.writeInt(age)
}
// 객체를 생성하는 Creator
companion object CREATOR : Parcelable.Creator<MyParcelableObject> {
override fun createFromParcel(parcel: Parcel): MyParcelableObject {
return MyParcelableObject(parcel)
}
override fun newArray(size: Int): Array<MyParcelableObject?> {
return arrayOfNulls(size)
}
}
// 필요한 경우 추가적인 설정이나 메서드를 구현할 수 있음
override fun describeContents(): Int {
return 0
}
}
이름과 나이를 옮길 뿐인데 저 코드를 써야한다는 것이다. 엄청 많기 때문에 . serializable을 쓴다고 한다.
하지만 parcelable 어노테이션을 사용하면 저 많은 코드를 다 쓸 필요가 없다.
@Parcelize
data class User(val name: String, val age: Int) : Parcelable // 긴 코드를 쓸 필요없이 이거면 끝
// 데이터 전달
val user = User("John Doe", 30)
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("EXTRA_USER", user)
}
startActivity(intent)
// 데이터 수신
val receivedUser = intent.getParcelableExtra<User>("EXTRA_USER")
위처럼 엄청나게 간결해진다. 하지만 무작정 parcelable 어노테이션을 갖다 붙인다고 되진 않는다.
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-parcelize") // 이걸 붙여줘야함
}
플러그인에 써놓고 씽크나우를 클릭해줘야 적용이 된다.
728x90
반응형