Serializable
- Serializable은 Java에서 제공하는 인터페이스로, 객체를 직렬화하여 전달하기 위해 사용됩니다.
- Serializable을 사용하면 객체를 바이트 스트림으로 변환하여 전달합니다.
- Serializable 인터페이스를 구현한 객체는 Java에서 제공하는 ObjectOutputStream을 사용하여 전달됩니다.
- Serializable을 사용하면 Serializable 선언 외에 추가하는 코드가 없어서 편리하게 사용할 수 있습니다.
- Serializable은 내부적으로 Reflection을 사용하는데 이 처리 과정 중에 많은 객체들이 추가로 생성되고 사용됩니다. 이 많은 객체들은 가비지 컬렉터의 타겟이 되어 가비지 컬렉터의 과도한 동작으로 인해서 성능 저하가 발생합니다.
data class Student(
val name: String,
val age: Int
) : Serializable
Parcelable
- Parcelable은 안드로이드에서 제공하는 인터페이스로, 객체를 직렬화하여 전달하기 위해 사용됩니다.
- Parcelable을 사용하면 객체를 안드로이드 OS에서 처리할 수 있는 바이트 배열로 변환하여 전달합니다.
- Parcelable 인터페이스를 구현한 객체는 안드로이드 OS에서 Intent나 Bundle에 담겨 전달됩니다.
- Parcelable을 사용하면 Parcelable 인터페이스 상속 함수를 직접 구현해야 되기 때문에 사용하기 어렵습니다.
- Parcelable은 Serializable과 달리 직렬화 처리를 사용자가 명시적으로 작성하기 때문에 Reflection을 사용하지 않습니다. 따라서, Serializable보다 빠르고 안정성이 높습니다.
// Java
data class Student(val name: String?, val age: Int) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readInt()
)
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.writeString(name)
dest?.writeInt(age)
}
companion object CREATOR : Parcelable.Creator<Student> {
override fun createFromParcel(parcel: Parcel): Student {
return Student(parcel)
}
override fun newArray(size: Int): Array<Student?> {
return arrayOfNulls(size)
}
}
}
// Kotlin -> @Parcelize 어노테이션을 사용하면 추가 함수 구현 없이 사용 가능
@Parcelize
data class Student(
val name: String?,
val age: Int
) : Parcelable
728x90
반응형
'안드로이드 > 개념' 카테고리의 다른 글
[Android] 런타임 권한 요청하기 (0) | 2023.07.28 |
---|---|
[Android] registerForActivityResult 사용하기 (0) | 2023.07.26 |
[Android] Timer와 Thread (0) | 2023.07.18 |
[Android] 명시적 인텐트와 암시적 인텐트 (0) | 2023.07.16 |
[Android] Activity 상태 변경 처리 (0) | 2023.07.16 |