๐Ÿ“Œ@Serializable๊ณผ @Parcelable์˜ ์ฐจ์ด

LoyalFlowerยท2025๋…„ 3์›” 6์ผ

์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์—์„œ @Serializable๊ณผ @Parcelable์€ ๊ฐ๊ฐ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”(Serialization)๋ฅผ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด์ง€๋งŒ, ๋ชฉ์ ๊ณผ ์‚ฌ์šฉ ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.


1. @Serializable (Kotlin Serialization)

  • ํŒจํ‚ค์ง€: kotlinx.serialization.Serializable
  • ์‚ฌ์šฉ ๋ชฉ์ : JSON ๋“ฑ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”
  • ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ : Kotlinx Serialization ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
  • ์žฅ์ :
    • JSON (๋˜๋Š” ๋‹ค๋ฅธ ํฌ๋งท)์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ
    • Kotlin ๋ฉ€ํ‹ฐํ”Œ๋žซํผ(KMP)์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • Reflection ์—†์ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ตœ์ ํ™”๋˜๋ฏ€๋กœ ์†๋„๊ฐ€ ๋น ๋ฆ„
  • ๋‹จ์ :
    • ์•ˆ๋“œ๋กœ์ด๋“œ์˜ Intent๋‚˜ Bundle์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์—†์Œ
    • ์ถ”๊ฐ€๋กœ kotlinx.serialization.json.Json์„ ํ™œ์šฉํ•ด์•ผ ํ•จ

์‚ฌ์šฉ ์˜ˆ์‹œ:

import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

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

fun main() {
    val user = User("Alice", 25)
    val json = Json.encodeToString(user)
    println(json)  // {"name":"Alice","age":25}
}

2. @Parcelize (Parcelable)

  • ํŒจํ‚ค์ง€: android.os.Parcelable
  • ์‚ฌ์šฉ ๋ชฉ์ : ์•ˆ๋“œ๋กœ์ด๋“œ Intent ๋˜๋Š” Bundle์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ
  • ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ : Android Parcelable API
  • ์žฅ์ :
    • ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ Serializable๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ์ข‹์Œ (๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ , GC ๋ถ€๋‹ด ์ ์Œ)
    • @Parcelize๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์—†์ด ์ž๋™์œผ๋กœ Parcelable ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๋‹จ์ :
    • ์•ˆ๋“œ๋กœ์ด๋“œ ์ „์šฉ (Kotlin ๋ฉ€ํ‹ฐํ”Œ๋žซํผ์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€)
    • JSON ๋ณ€ํ™˜์„ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š์Œ

์‚ฌ์šฉ ์˜ˆ์‹œ:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class User(val name: String, val age: Int) : Parcelable
// Intent์— ๋ฐ์ดํ„ฐ ๋‹ด๊ธฐ
val intent = Intent(this, SecondActivity::class.java).apply {
    putExtra("user", User("Alice", 25))
}

// Intent์—์„œ ๋ฐ์ดํ„ฐ ๊บผ๋‚ด๊ธฐ
val user: User? = intent.getParcelableExtra("user")

๐Ÿš€ ์ •๋ฆฌ: ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์–ด๋…ธํ…Œ์ด์…˜์ฃผ์š” ์šฉ๋„์ฃผ์š” ๊ธฐ๋Šฅ์žฅ์ ๋‹จ์ 
@Serializable๋„คํŠธ์›Œํฌ ํ†ต์‹ , JSON ๋ณ€ํ™˜JSON ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”Kotlin ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ์ง€์›, ๋น ๋ฅธ ์ปดํŒŒ์ผ ํƒ€์ž„ ์ตœ์ ํ™”Android Intent์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
@Parcelize์•ˆ๋“œ๋กœ์ด๋“œ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (Intent, Bundle)Parcelable ๊ตฌํ˜„ ์ž๋™ํ™”์„ฑ๋Šฅ ์ตœ์ ํ™”, ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋น ๋ฆ„์•ˆ๋“œ๋กœ์ด๋“œ ์ „์šฉ, JSON ๋ณ€ํ™˜ ๋ถˆ๊ฐ€๋Šฅ

โœ… ์ •๋ฆฌํ•˜๋ฉด

  • ๋„คํŠธ์›Œํฌ ํ†ต์‹ , JSON ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋ฉด โ†’ @Serializable
  • ์•ˆ๋“œ๋กœ์ด๋“œ ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ Intent๋‚˜ Bundle๋กœ ์ „๋‹ฌํ•˜๋ ค๋ฉด โ†’ @Parcelize
  • TypeSafeNavigation์—์„œ๋„ @Serializable
profile
๋А๋‚€ ์ ์„ ์ ์–ด๋‚˜๊ฐ€๋ฉฐ ์„ฑ์žฅํ•˜๋Š” ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€