“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”
Activity 간 데이터를 주고 받을 때 객체를 주고 받아야 할 일이 있다.
하지만 putExtra()
에는 객체가 담기지 않는다.
이때 필요한 것이 직렬화이다.
직렬화를 하는 방법은 Serializable과 Parcelable 두가지가 있다.
그리고 putExtra()
의 param으로도 기재되어 있는 것을 확인할 수 있다.
직렬화란 객체를 외부에서도 사용이 가능하도록 바이트 형태로 변환하는 것과 반대로 바이트 형태의 객체를 사용가능한 형태로 변환하는 것을 말한다.
후자는 역직렬화(Deserialization)라고 한다.
위에서 말했던 것처럼 안드로이드에선 Serializable
과 Parcelable
두가지 방법을 제공한다.
Serializable
은 Java 표준 interface로
JVM이 사용되는 곳이면 어디서든 사용가능한 직렬화 방법이다.
사용방법은 매우 간단하다.
data class SDT(
val age: Int,
val name: String
) : Serializable
Serializable
를 구현받으면 끝이다.
재정의를 해야할 부분이 하나도 없는데
이는 Serializable
이 마커 인터페이스(Marker Interface)로써
구현받은 클래스는 직렬화 대상이라고 알려주기만 한다.
아래는 Serializable
의 원본이다.
정말 아무것도 없다.
다만 개발자가 설정해줘야할 부분이 없으니 편해보이겠지만
사실 시스템이 개발자 대신에 처리를 해주는 것이다.
Serializable
은 reflaction 기법이 사용되었으며
이로 인해 직렬화 도중 수많은 객체가 생성 및 사용되고
이를 제거하기 위해 가비기 컬렉터(GC)가 활발히 움직이다보니
이는 곧 성능 저하 및 배터리 소모가 발생할 수 있다.
Parcelable
는 Android SDK interface로
Android에서 Serializable
의 단점을 보완하기 위해 도입되었다.
reflaction 기법이 빠짐으로써 Serializable
보다
성능에서의 이점은 확실히 얻게 되었지만 개발자가 직접 처리방법을 명시해주어야 하는 단점이 생겼다.
data class DT(
val age: Int,
val name: String?
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString()
) {
}
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.let {
it.apply {
writeInt(age)
writeString(name)
}
}
}
companion object CREATOR : Parcelable.Creator<DT> {
override fun createFromParcel(parcel: Parcel): DT {
return DT(parcel)
}
override fun newArray(size: Int): Array<DT?> {
return arrayOfNulls(size)
}
}
}
위처럼 처리코드를 명시해주어야하니
보일러플레이트 코드가 발생하고
이로 인해 코드가 복잡해져 유지보수가 힘들어진다는 단점이 존재한다.
하지만 단점을 보완해줄 어노테이션이 하나 있다.
바로 @Parcelize
이다.
본래 kotlin-android-extension
에 포함되어 있었지만
kotlin-android-extension
이 deprecated 된 후에
독립(?)해서 나왔다.
우선 build.gradle
에서 플러그인을 추가해주자
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-parcelize' // Add
}
'kotlin-parcelize'
하나 추가해주면 된다.
그리고 다음은 아래와 같다.
@Parcelize
data class DTT(
val age: Int,
val name: String
) : Parcelable
다이어트 성공
Serializable
못지않게 간단해졌다.
하지만 이 또한 단점은 존재하는데 기본 생성자에 선언된 것만
직렬화를 보장한다.
개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.