Serializable과 Parcelable

지프치프·2022년 3월 24일
0

Android

목록 보기
48/86
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

Activity 간 데이터를 주고 받을 때 객체를 주고 받아야 할 일이 있다.
하지만 putExtra()에는 객체가 담기지 않는다.
이때 필요한 것이 직렬화이다.
직렬화를 하는 방법은 Serializable과 Parcelable 두가지가 있다.
그리고 putExtra()의 param으로도 기재되어 있는 것을 확인할 수 있다.

직렬화란?

직렬화란 객체를 외부에서도 사용이 가능하도록 바이트 형태로 변환하는 것과 반대로 바이트 형태의 객체를 사용가능한 형태로 변환하는 것을 말한다.
후자는 역직렬화(Deserialization)라고 한다.
위에서 말했던 것처럼 안드로이드에선 SerializableParcelable 두가지 방법을 제공한다.

Serializable

Serializable은 Java 표준 interface로
JVM이 사용되는 곳이면 어디서든 사용가능한 직렬화 방법이다.
사용방법은 매우 간단하다.

data class SDT(
    val age: Int,
    val name: String
) : Serializable

Serializable 를 구현받으면 끝이다.
재정의를 해야할 부분이 하나도 없는데
이는 Serializable이 마커 인터페이스(Marker Interface)로써
구현받은 클래스는 직렬화 대상이라고 알려주기만 한다.
아래는 Serializable 의 원본이다.

정말 아무것도 없다.

다만 개발자가 설정해줘야할 부분이 없으니 편해보이겠지만
사실 시스템이 개발자 대신에 처리를 해주는 것이다.
Serializable은 reflaction 기법이 사용되었으며
이로 인해 직렬화 도중 수많은 객체가 생성 및 사용되고
이를 제거하기 위해 가비기 컬렉터(GC)가 활발히 움직이다보니
이는 곧 성능 저하 및 배터리 소모가 발생할 수 있다.

Parcelable

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

하지만 단점을 보완해줄 어노테이션이 하나 있다.
바로 @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 못지않게 간단해졌다.
하지만 이 또한 단점은 존재하는데 기본 생성자에 선언된 것만
직렬화를 보장한다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글