04
05

Intent๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ primitive type์€ ๊ทธ๋ƒฅ ์ „๋‹ฌํ•˜๋ฉด ๋˜์ง€๋งŒ, data class๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด๋“ค์€ ์ง๋ ฌํ™” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

# ์ง๋ ฌํ™”๊ฐ€ ์™œ ํ•„์š”ํ• ๊นŒ?

JVM์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” primitive type ๋ฐ์ดํ„ฐ๋Š” ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๋ฉด์„œ ๋ฐ”์ดํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ๊ทธ๋ž˜์„œ ํ†ต์‹ ํ•  ๋•Œ๋„ ํ˜•ํƒœ๊ฐ€ ์œ ์ง€๋˜๋Š”๋ฐ, class๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ€๊ณ  heap์— ๊ฐ์ฒด ์•ˆ์— ์žˆ๋Š” ๋ฉค๋ฒ„๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค. ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋ฉค๋ฒ„ ๋ฐ์ดํ„ฐ ๊นŒ์ง€ ์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ด์„œ JVM์— ์ƒ์ฃผ์‹œํ‚จ๋‹ค. ์ง๋ ฌํ™” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ  ๋‚˜์„œ์•ผ ์™ธ๋ถ€๋กœ ์ด ๊ฐ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.(ํŒŒ์ผ ์“ฐ๊ธฐ, ์ฝ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹ )

 

kotlin์€ java๋ฅผ ๊ณ„์Šนํ•œ ์–ธ์–ด์ด๊ณ , ๋‹น์—ฐํžˆ ๋งˆ์ปค์ธํ„ฐํŽ˜์ด์Šค์ธ Serializable์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์—์„œ Serializable์„ implements๋งŒ ํ•˜๋ฉด ๋๋˜๊ฑธ ๊ทธ๋Œ€๋กœ ์ฝ”ํ‹€๋ฆฐ ๋ฌธ๋ฒ•์— ์ ์šฉํ–ˆ๋‹ค.

data class Person(
    val firstName: String,
    val lastName: String
) : Serializable

์ด๋Œ€๋กœ ์จ๋„ ๋˜์ง€์•Š๋‚˜?? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ๋•Œ ์ฏค Parcelable์˜ ์กด์žฌ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

# Parcelable

Parcelable์€ Android SDK์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ Serializable์„ ๊ฐœ์„ ํ•œ ๋ฒ„์ „์ด๋‹ค. Serializable์€ ๋‚ด๋ถ€์—์„œ ์ž๋ฐ” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์ง๋ ฌํ™”๋ฅผ ์ฒ˜๋ฆฌ(์ง๋ ฌํ™” ๋ฐฉ์‹์„ ๋ฆฌํ”Œ๋ ‰์…˜์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค)ํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์ด ๋งŽ์ด ์ผ์–ด๋‚˜๊ณ  ์ƒ์„ฑ๋œ ์˜ค๋ธŒ์ ํŠธ๋Š” GC ๋Œ€์ƒ์ด ๋˜๋ฉฐ, ๊ทธ๋กœ ์ธํ•ด ์ž์›์„ ์žก์•„๋จน์–ด ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚จ๋‹ค. ๋ฆฌํ”Œ๋ ‰์…˜์€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€ ์†์„ฑ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋น„์šฉ์ด ๋งค์šฐ ํฐ ์ž‘์—…์ด๋‹ค. ๋ฆฌํ”Œ๋ ‰์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ์„œ ๋” ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Parcelable์€ Serializable์ด ํ•˜๋Š” ์ผ์€ ๊ทธ๋Œ€๋กœ ํ•˜๋ฉด์„œ, ์ง๋ ฌํ™” ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋ช…์‹œํ•˜์—ฌ ๋ฆฌํ”Œ๋ ‰์…˜์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. => ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ƒ๊ธด๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

 

์œ„์—์„œ Serializable๋กœ ์„ ์–ธํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ Parcelable๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์•„์ง„๋‹ค. ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ nullable์ธ ์ด์œ ๋Š” ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

parcelable์˜ readString๋งŒ ๋ณด๋ฉด,

@Nullable
public final String readString() {
    return readString16();
}

@Nullable๋กœ ์„ ์–ธ๋˜์–ด์žˆ์–ด์„œ ์ƒ์„ฑ์ž๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ์ƒ๊ธธ ์˜ค๋ฅ˜๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด์„œ๋ผ๋„ ํ”„๋กœํผํ‹ฐ๋ฅผ nullableํ•˜๊ฒŒ ์„ ์–ธํ•œ๋‹ค.

data class Person(
    var firstName: String?,
    var lastName: String?,
    var age: Int?
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString(),
        parcel.readInt()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(firstName)
        parcel.writeString(lastName)
        age?.let { parcel.writeInt(it) }
    }

    override fun describeContents(): Int {
        return 0
    }

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

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

 

Parcelable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๋ช‡๋ช‡ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.

  • constructor(parcel: Parcel)
    parcel์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด this๋กœ Person ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • writeToParcel(parcel: Parcel, flags: Int)
    Person ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ Parcel์— ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋‹ค.
  • describeContents()
    Parcel content์— ๋Œ€ํ•œ flag๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ฒ„์ „๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์—ฌ๊ธฐ์— ๋ฒ„์ „์„ ๋‹ด์•„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • companion object CREATOR: Parcelable.Creator<Person>
    • createFromParcel ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ Parcel๋กœ Person ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  
    • newArray ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •๋œ ํฌ๊ธฐ์˜ Person ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a non-null public static field called CREATOR of a type that implements the Parcelable.Creator interface.

 

Parcelable์ธํ„ฐํŽ˜์ด์Šค์— CREATOR๊ฐ€ non-null์ธ static field๋กœ ์ •์˜๋˜์–ด์žˆ์–ด์„œ companion object๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋“ค๋กœ ์ˆ˜๋งŽ์€ DTO๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋งค๋ฒˆ ์ด ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•˜๋Š” ๊ฑด ๋ฒˆ๊ฑฐ๋กญ๋‹ค๊ณ  ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค.

# Parcelize

์ด๊ฑธ ์ž๋™ํ™” ํ•ด๋‘” ๊ฒŒ Parcelize ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‹ค. ๋ช‡ ๋…„ ์ „์—๋Š” beta์˜€์ง€๋งŒ ์ง€๊ธˆ์€ ์ •์‹ ๋ฐฐํฌ๊ฐ€ ๋˜์—ˆ๊ณ  ๊พธ์ค€ํžˆ ๊ตฌ๊ธ€์—์„œ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

์‚ฌ์šฉํ•  ๋ชจ๋“ˆ์˜ gradle์— plugin์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ 

plugins {
    id("kotlin-parcelize")
}

@Parcelize ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋๋‚œ๋‹ค.

@Parcelize
data class Person(
    var firstName: String?,
    var lastName: String?,
    var age: Int?
) : Parcelable

๊ฒฐ๊ณผ์ ์œผ๋กœ Serializable์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋ฆฌํ”Œ๋ ‰์…˜์ด ์ผ์–ด๋‚˜์ง€์•Š๋Š” ์ฝ”๋“œ๊ฐ€ ๋˜์—ˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๋‚ ๋ ธ์ง€๋งŒ, ์ง๋ ฌํ™” ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์กฐ์น˜๊ฐ€ ์žˆ์œผ๋ฉด ์—ฌ์ „ํžˆ Parcelable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ›์•„์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜•ํƒœ๋Š” ์กฐ๊ธˆ ๋‹ฌ๋ผ์ง„๋‹ค.

transient์™€ ๊ฐ™์ด ์ง๋ ฌํ™” ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๋ฉค๋ฒ„์— @IgnoredOnParcel์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

@Parcelize
data class Person(
    var firstName: String?,
    var lastName: String?,
    var age: Int?
) : Parcelable{
	private companion object : Parceler<Person> {
        override fun User.write(parcel: Parcel, flags: Int) {
            // Custom write implementation
        }

        override fun create(parcel: Parcel): Person {
            // Custom read implementation
        }
    }
}

์•„๋ž˜ ๋งํฌ์— Parcelize๊ฐ€ ์ง€์›ํ•˜๋Š” Type์„ ๋‚จ๊ฒจ๋‘์—ˆ๋‹ค.

https://developer.android.com/kotlin/parcelize?hl=ko#types

 

Parcelable ๊ตฌํ˜„ ์ƒ์„ฑ๊ธฐ  |  Kotlin  |  Android Developers

์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Parcelable ๊ตฌํ˜„ ์ƒ์„ฑ๊ธฐ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. kotlin-parcelize ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Parcelable

developer.android.com

# Serializable๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์ค€๋‹ค๋ฉด?

Parcelable์ด ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“  ๋ฐฉ์‹์€ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํƒ€์ง€ ์•Š๋„๋ก ์ง์ ‘ ์ง€์ •ํ•ด์ค€ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Seralizable์—๋„ ๋˜‘๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

Serializable๋„ ์–ด๋…ธํ…Œ์ด์…˜์—์„œ ๋๋‚˜์ง€์•Š๊ณ  ์ปค์Šคํ…€์œผ๋กœ writeObject, readObject, readObjectNoData๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค...! ์‹ฌ์ง€์–ด 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

 

Parcelable vs Serializable , ์ •๋ง Serializable์€ ๋Š๋ฆด๊นŒ?

์›๋ฌธ : “Parcelable vs Serializable”

medium.com


Serializable์„ customํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹๊ฒ ์ง€๋งŒ, ๊ณ ๊ธ‰ ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ• ๋•Œ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๊ณ , ๋‹จ์ˆœํžˆ data class๋ฅผ intent๋กœ ๋„˜๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ๋Š” Parcelize ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋น„์šฉ ์ƒ ์ด์ ์„ ๋” ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

:: ์ฐธ๊ณ  ์ž๋ฃŒ ::

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://bladecoder.medium.com/a-study-of-the-parcelize-feature-from-kotlin-android-extensions-59a5adcd5909

https://www.charlezz.com/?p=44613

https://www.charlezz.com/?p=823

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^
๋ฐ˜์‘ํ˜•
COMMENT