Parcelable이란?

heetaeheo·2022년 6월 25일
0
post-thumbnail

Parcelable

Parcelable은 Android에서 지원해주는 SDK에 포함되어 있는 인터페이스입니다. Parcel은 소포, 택배라는 뜻을 가지고 있으며 Parcelable이라 함은 택배로 부칠 수 있는 정도로 해석할 수 있겠습니다.

Parcelabe의 장점

  • Serializable 대비 훨씬 빠른 속도(Reflection 사용x , 직렬화와 역직렬화 로직을 개발자가 구현해주기 때문에, 이러한 로직들이 미리 컴파일되어 런타임시 빠른 처리가 가능합니다.)

    -> Reflection을 사용하지 않았기에 런타임시 객체를 생성할 필요가 없어 GC의 부담이 적어집니다.

    대신 직렬화와 역직렬화 로직을 개발자가 구현하기 때문에 단점이라고 한다면

Parcelabe의 단점

  • 보일러 플레이트 코드가 늘어남
    -> 직렬화 : writeToParcel() 메서드를 통해 Parcel 객체에 데이터 저장
    -> 역직렬화 : createFromParcel() 메서드를 통해 Parcel로부터 원래 객체 모양에 따라 데이터 복원

    만약 이름과 이메일 필드를 갖는 User 클래스에 Parcelable 인터페이스를 구현하자고 한다면

    User 클래스

class User { 
	val name : String? = null
    val email : String? = null
}

User <- Parcelabe

import android.os.Parcel
import android.os.Parcelable

class User() : Parcelable {
    var name: String? = null
    var email: String? = null

    constructor(parcel: Parcel) : this() {
        parcel.run {
            name = readString()
            email = readString()
        }
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.run {
            writeString(this@User.name)
            writeString(this@User.email)
        }
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }
    }
}

단점에서 설명한 것처럼 굉장히 복잡해 보이고 봐야할 코드가 많아 보입니다.

이때 등장한 것이 Parcelize입니다.

Serializable과 Parcelable은 각기다른 장단점이 존재했습니다. 분명 Intent시에 객체 전달은 앱 개발 시 자주 사용되는데 이들의 장점만을 합쳐볼 순 없을까 하여 탄생한 것이 Parcelize입니다.

build.gradle에 플러그인 추가를 해주고 코드에서 사용하면 됩니다.

plugins {
    id("kotlin-parcelize")
}

사용법은 다음과 같이 사용하면 자동으로 생성이 됩니다.

//위드마켓 프로젝트에 적용된 실제 코드

@Parcelize
data class EmailData(
    val emailAddress : String,
    val title: String,
    val content: String
):Parcelable

0개의 댓글