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๋ณด๋ค ์๋๊ฐ ๋ ๋น ๋ฅด๋ค๊ณ ๋์จ ํ ์คํธ ๊ฒฐ๊ณผ๋ ์๋ค.
Parcelable vs Serializable , ์ ๋ง Serializable์ ๋๋ฆด๊น?
์๋ฌธ : “Parcelable vs Serializable”
medium.com
Serializable์ customํด์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข๊ฒ ์ง๋ง, ๊ณ ๊ธ ์ง๋ ฌํ๋ฅผ ์ํํ ๋๋ ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ ๊ฒ ๊ฐ๊ณ , ๋จ์ํ data class๋ฅผ intent๋ก ๋๊ธฐ๊ณ ์ถ์ ๋๋ Parcelize ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ ๊ฒ ๋น์ฉ ์ ์ด์ ์ ๋ ๊ฐ์ ธ๊ฐ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
:: ์ฐธ๊ณ ์๋ฃ ::
https://www.charlezz.com/?p=44613
https://www.charlezz.com/?p=823
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'Android ๐ฅ๏ธ > ์ฝ์งโ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Firebase Cloud Messaging(FCM) ์ฝ์งํ๊ธฐ (0) | 2024.04.16 |
---|---|
LiveData ์์๋ณด๊ธฐ (0) | 2024.04.10 |
์๋๋ก์ด๋ ๋ฌดํ์คํฌ๋กค ๊ธฐ์ด - Infinite Scroll, Endless Scroll (0) | 2024.04.03 |
ListAdapter - DiffUtil ์ฝ์ง (0) | 2024.04.03 |
[๋ฒ๊ทธ/์ค๋ฅ] Uri(Url) encoding/decoding - API ์ฌ์ฉ์ (0) | 2024.03.29 |