반응형
Serialize, Parcelable, Parcelize를 사용하는 이유
기본 자료형과 참조 자료형 객체를 갖고 있는 데이터 클래스를 전달하기 위해 사용한다. 주로 안드로이드에서는 Intent에 데이터 객체 담아 보낼 때 사용된다.
Serialize
이름 그대로 데이터를 직렬화 해주는 방식이다. Kotlin에서 구현하면 아래처럼 굉장히 짧게 구현할 수 있다.
data class Player(val league: String, val skill: String): Serializable
reflection이라는 기술을 사용하여 런타임에서 데이터를 직렬화/역 직렬 화하는 과정을 진행하기 때문에 GC가 할 일이 늘어나 속도가 느리다.
Parcelable
기존 java를 이용해 앱 개발했을 때, 사용하던 방식으로 마찬가지로 데이터 클래스가 전달될 필요가 있을 때 사용된다. 코드를 보면 직렬화와 역직렬화를 모두 구현해 줘야 하기 때문에 코드 길이가 길어진다.
data class Player constructor(var league:String,var skill:String) : Parcelable {
constructor(parcel: Parcel) : this(
// pacel에서 String를 읽어오는 과정
parcel.readString()?:"Null",
parcel.readString()?:"Null"
)
// writeToParcel은 메서드 이름처럼 Parcel에 순서대로 데이터를 적는 과정 = 데이터 직렬화
override fun writeToParcel(parcel: Parcel, flags: Int) {
// league, skill이 순서대로 parcel에 담는중
// String, Int, Double 등 객체의 타입에 맞게 write(Type)을 맞춰줌
parcel.writeString(league)
parcel.writeString(skill)
}
override fun describeContents(): Int {
return 0
}
// companion object를 사용하면 java에서 정적 변수/메서드를 사용하는 것과 동일하다.
// Parcel에서 Byte단위의 데이터를 복원하고 Player객체를 다시 복원 = 데이터 역직렬화
companion object CREATOR : Parcelable.Creator<Player> {
override fun createFromParcel(parcel: Parcel): Player {
return Player(parcel)
}
override fun newArray(size: Int): Array<Player?> {
return arrayOfNulls(size)
}
}
}
대신 Serialize보다 훨씬 빠르다.
Parcelize
Serialize와 Parcelable의 장점을 섞어 놓은 라이브러리로 보인다. 때문에 코드 길이도 짧으면서 속도도 빠르다.
@Parcelize
data class Player constructor(var league:String,var skill:String) : Parcelable
다만 아래 처럼 gradle에 등록해줘야 하며 kotlin으로 개발하는 경우에만 사용할 수 있다.
plugins {
id("kotlin-parcelize")
}
반응형
'개발 > Android' 카테고리의 다른 글
안드로이드 4대 컴포넌트 (0) | 2021.03.05 |
---|---|
[Android] 화면 크기 별 Layout 생성 (0) | 2021.03.05 |
화면 회전에도 상태 값 유지하기 (0) | 2021.03.05 |
Parameter 'directory' is not a directory 에러 (0) | 2021.02.23 |
[Android] BottomNavigationView와 Navigation Graph를 같이 쓰는 경우 (0) | 2021.02.16 |