Parcelable은 Android에서 지원해주는 SDK에 포함되어 있는 인터페이스입니다. Parcel은 소포, 택배라는 뜻을 가지고 있으며 Parcelable이라 함은 택배로 부칠 수 있는 정도로 해석할 수 있겠습니다.
Serializable 대비 훨씬 빠른 속도(Reflection 사용x , 직렬화와 역직렬화 로직을 개발자가 구현해주기 때문에, 이러한 로직들이 미리 컴파일되어 런타임시 빠른 처리가 가능합니다.)
-> Reflection을 사용하지 않았기에 런타임시 객체를 생성할 필요가 없어 GC의 부담이 적어집니다.
대신 직렬화와 역직렬화 로직을 개발자가 구현하기 때문에 단점이라고 한다면
보일러 플레이트 코드가 늘어남
-> 직렬화 : writeToParcel() 메서드를 통해 Parcel 객체에 데이터 저장
-> 역직렬화 : createFromParcel() 메서드를 통해 Parcel로부터 원래 객체 모양에 따라 데이터 복원
만약 이름과 이메일 필드를 갖는 User 클래스에 Parcelable 인터페이스를 구현하자고 한다면
User 클래스
class User {
val name : String? = null
val email : String? = null
}
User <- Parcelabe
import android.os.Parcel
import android.os.Parcelable
class User() : Parcelable {
var name: String? = null
var email: String? = null
constructor(parcel: Parcel) : this() {
parcel.run {
name = readString()
email = readString()
}
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.run {
writeString(this@User.name)
writeString(this@User.email)
}
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<User> {
override fun createFromParcel(parcel: Parcel): User {
return User(parcel)
}
override fun newArray(size: Int): Array<User?> {
return arrayOfNulls(size)
}
}
}
단점에서 설명한 것처럼 굉장히 복잡해 보이고 봐야할 코드가 많아 보입니다.
Serializable과 Parcelable은 각기다른 장단점이 존재했습니다. 분명 Intent시에 객체 전달은 앱 개발 시 자주 사용되는데 이들의 장점만을 합쳐볼 순 없을까 하여 탄생한 것이 Parcelize입니다.
build.gradle에 플러그인 추가를 해주고 코드에서 사용하면 됩니다.
plugins {
id("kotlin-parcelize")
}
사용법은 다음과 같이 사용하면 자동으로 생성이 됩니다.
//위드마켓 프로젝트에 적용된 실제 코드
@Parcelize
data class EmailData(
val emailAddress : String,
val title: String,
val content: String
):Parcelable
좋은글 감사합니다.
Parcelabe에 l이 빠졌습니다.