앱을 개발하다보면 액티비티, 프래그먼트 이동 시에 각각에 데이터를 전달해야하는 경우가 있다. 보통 putExtra를 통해 값을 한 개씩 넣는데, 넣을 값이 많아지면 굉장히 불편해진다. 이것을 방지하기위해서는 데이터 객체자체를 넘겨줘야하는데 기본적인 putExtra로는 보낼 수 없고 객체를 직렬화해주어야 넘길 수 있다.
직렬화를 가능하게 하는 Parcelable, Serializable에 대해 알아보자
우선 직렬화는 '자바 언어에서 사용되는 Object 또는 Data를 다른 컴퓨터의 자바 시스템에서도 사용 할수 있도록 바이트 스트림(stream of bytes) 형태로 연속전인(serial) 데이터로 변환하는 포맷 변환 기술'을 일컫는다.
데이터를 넘겨주기 위해 새로운 포맷을 만드는 행위이다.
먼저, Serializable에 대해 알아보자
Serializable은 자바 표준 인터페이스(java.io.Serializable) 중 하나로 안드로이드 SDK에는 포함되어있지 않는다.
전달하고자 하는 데이터 클래스에 Serializable인터페이스만 상속처리를 해주면 데이터 클래스 자체를 전달할 준비가 완료 가된다.
data class Book(
val id: String?,
val title: String?,
val description: String?,
...
): Serializable
구현은 굉장히 간단하다. 하지만 성능상에 큰 이슈가 있다.
Serializable은 내부에서 자바의 리플렉션이 발생하게 되어 많은 오브젝트들이 생성되고, 이에따른 gc(garbage collection)가 발생하게 되어 앱의 성능을 낮추게 된다.
이를 보완하는 Parcelable을 알아보자
Parcelable은 또다른 직렬화 인터페이스로 자바에 기본적으로는 내장되어 있지 않고, 안드로이드 SDK내에 있다.
Parcelable은 리플렉션을 사용하지 않기위해 특별하게 설계되있다.
Book 클래스에 Parcelable을 적용시켜보자
import android.os.Parcelable
data class Book(
val id: String?,
var title: String?,
var description: String?
...
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString(),
parcel.readString()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(id)
parcel.writeString(title)
parcel.writeString(description)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<TodoModel> {
override fun createFromParcel(parcel: Parcel): TodoModel {
return TodoModel(parcel)
}
override fun newArray(size: Int): Array<TodoModel?> {
return arrayOfNulls(size)
}
}
}
위와 같이 Parcelable을 상속시키고 오토 오버라이딩을 하면 클래스 구현부가 만들어진다.
리플렉션을 없애기 위해 만들어졌다고 하지만, 굉장히 많은 보일러 플레이트 코드(중복되는 코드)가 생성되었다.
그렇기에 추가되는 구현과 유지 보수 비용이 증가되는 단점이 있다.
그런데 여기서 코틀린에서는 아주 간결하게 Parcelable을 구현할 수 있게 플러그인을 제공해준다.
먼저, 앱수준의 build.gradle에서 plugins에 id 'kotlin-parcelize'라는 플러그인을 추가한다.
그러면 Parcelable을 다음과 같이 구현할 수 있다.
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class TodoModel(
val id: String,
var title: String?,
var description: String?
) : Parcelable
어노테이션 하나로 기존에 있던 보일러 플레이트 코드를 작성하지 않아도 된다!
성능쪽으로는
https://medium.com/@limgyumin/parcelable-vs-serializable-%EC%A0%95%EB%A7%90-serializable%EC%9D%80-%EB%8A%90%EB%A6%B4%EA%B9%8C-bc2b9a7ba810 (번역)
https://medium.com/android-news/parcelable-vs-serializable-6a2556d51538 (원문)
위 글을 보면 기본적인 사용법에 의하면 Parcelable이 Serializable보다 기본적인 사용법에 의하면 10배 이상 빠르다고한다.
하지만 기본 사용법이 아니라 커스텀하게 사용하게되면 오히려 Serializable이 Parcelable 빠르게 될 수 있다고도한다..
이렇게 의견이 분분한 가운데 어떤 것을 사용하면 좋을까?
필자는 커스텀할 정도로 다뤄야 할 필요가 없다면 기본적인 방법과 코틀린 플러그인을 통해 개발 시간을 단축시키는게 이상적이라고 생각한다.
<-- 추가 내용 필요 시 업데이트 -->
ref.
Parcelable 구현 생성기 | Kotlin | Android Developers
Parcelable 구현 생성기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. kotlin-parcelize 플러그인은 Parcelable 구현 생성기를 제공합니다. Parcelable 지원을 포함하려
developer.android.com
(번역)
Parcelable vs Serializable , 정말 Serializable은 느릴까?
원문 : “Parcelable vs Serializable”
medium.com
(원문)
Parcelable vs Serializable
Often, when we develop applications, we have to transfer data from one Activity to another. Of course, we can not do that directly. The…
medium.com
'Android' 카테고리의 다른 글
| [Android] 인앱 업데이트 (0) | 2023.11.24 |
|---|---|
| fragment & lifecycle (0) | 2023.09.15 |
| [Android] ActionBar? ToolBar! (0) | 2023.08.11 |
| [Android] RecyclerView (0) | 2023.08.10 |
| [Android] TabLayout의 불편한 점을 덜어주는 ViewPager2 적용기 (0) | 2023.08.09 |