ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

First-party tooling ๐Ÿง

Exploring Android KTX

  • Android KTX๋Š” Android ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ Jetpack์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ํ™•์žฅ ์„ธํŠธ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋Š” Android KTX ํ™•์žฅ ์ž์ฒด๊ฐ€ Jetpack์˜ ์ผ๋ถ€์ด๋ฉฐ ๊ฐ„๋‹จํ•œ Gradle ์ข…์†์„ฑ์œผ๋กœ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Android KTX์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํ™•์žฅ ๊ธฐ๋Šฅ ๋ฐ ๊ณ ์ฐจ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ Android API๋ฅผ ๋ณด๋‹ค Kotlin ๊ด€์šฉ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ข…์†์„ฑ์„ ๋ณด๋‹ค ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Android KTX๋Š” ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ข…์†์„ฑ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • Core KTX
    • Fragment KTX
    • SQLite KTX
    • ViewModel KTX
    • Navigation KTX
    • WorkManager KTX
  • Android KTX ์ „์ฒด๋Š” ๋งŽ์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Core KTX ๋ฐ Fragment KTX๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํŠน์ • ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Adding Core KTX to your project

๋จผ์ € Core KTX๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ”„๋กœ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋จผ์ € google() Maven ์ €์žฅ์†Œ๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

repositories {
    google()
}

๊ทธ ๋‹ค์Œ (์ด์ „์— ๋งŒ๋“ค์–ด๋‘” buildSrc ํด๋” ์•ˆ์— ์ฐธ๊ณ )

object Android {
    object Tools {
        const val androidGradle = "com.android.tools.build:gradle:3.5.0-beta04"
    }

    object Ktx {
        const val core = "androidx.core:core-ktx:1.0.1"
    }
}

์•ฑ์ˆ˜์ค€ build.gradle.kts ์— ์ถ”๊ฐ€

dependencies {
    ...

    implementation(Deps.Android.Ktx.core)
}

์ด์ œ Core KTX๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Using Core

Core KTX์—๋Š” ๋‹ค์Œ์„ ํฌํ•จํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ•ต์‹ฌ Android ํ”„๋ ˆ์ž„์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ API๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•๋œ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • androidx.core.animation
  • androidx.core.preference
  • androidx.core.transition
  • androidx.core.view

Android KTX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋žซํผ API๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์˜ˆ ์ค‘ ํ•˜๋‚˜๋Š” SharedPreferences๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Kotlin์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ commit() ๋˜๋Š” apply()๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋งค์šฐ ์œ ์ฐฝํ•œ ๊ตฌ๋ฌธ์„ SharedPreferences ํŽธ์ง‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

val preferences = getPreferences(Context.MODE_PRIVATE)
preferences.edit { 
    putBoolean("key", false) 
    putString("key2", "value")
}

Android KTX์—์„œ ์ œ๊ณตํ•˜๋Š” ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” View.onPreDraw() ํ™•์žฅ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

button.doOnPreDraw {
    // Perform an action when view is about to be drawn
}

์ด๋ฅผ ํ†ตํ•ด ์ƒˆ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ•ด๋‹น ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋ก ์ทจ์†Œํ•˜์ง€ ์•Š๊ณ ๋„ View๊ฐ€ ๊ทธ๋ ค์ง€๋ ค๊ณ  ํ•  ๋•Œ ์‹คํ–‰๋  ๋กœ์ง์ด ํฌํ•จ๋œ ๋žŒ๋‹ค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Using Fragment KTX

์ด์ œ ํ”„๋ž˜๊ทธ๋จผํŠธ ์ž‘์—…์„ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ Fragment KTX ๋ชจ๋“ˆ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ƒˆ๋กœ์šด ์ข…์†์„ฑ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

object Android {
    ...
    object Ktx {
        const val core = "androidx.core:core-ktx:1.0.1"
        const val fragment = "androidx.fragment:fragment-ktx:1.0.0"
    }
}

์ด์ œ app/build.gradle.kts๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

dependencies {
    ...

    implementation(Deps.Android.Ktx.core)
    implementation(Deps.Android.Ktx.fragment)
}

์ข…์†์„ฑ์ด ์ถ”๊ฐ€๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด commit() ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ FragmentTransactions๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

supportFragmentManager.commit {
    addToBackStack("fragment name")
    add(SampleFragment(), "tag")
    setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out)
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด FragmentTransaction์„ ์ถ”๊ฐ€ํ•  ๋•Œ Kotlin์ด ๋” ๊ด€์šฉ์ ์œผ๋กœ ๋Š๊ปด์ง€๊ณ  ์ด๋Ÿฌํ•œ ์ž‘์—…๊ณผ ๊ด€๋ จ๋œ ์ผ๋ถ€ ์ƒ์šฉ๊ตฌ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

Core KTX ๋ฐ Fragment KTX์—์„œ ๋ณด์•˜๋“ฏ์ด ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Android ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์‹ค์ œ๋กœ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ™•์žฅ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ Android KTX ์ข…์†์„ฑ ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Android ๊ฐœ๋ฐœ์„ ์œ„ํ•ด Kotlin์„ ํ™œ์šฉํ•˜๋Š” ๋ฐ ์‹ค์ œ๋กœ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Kotlin Android Extensions ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด Kotlin์„ ์‚ฌ์šฉํ•˜์—ฌ Android ๊ฐœ๋ฐœ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Using Kotlin Android Extensions

Kotlin Android Extensions ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Kotlin ๋ฐ Android ์ž‘์—…์„ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ ๋‘ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • findViewById() ์—†์ด Android ๋ณด๊ธฐ ์ฐธ์กฐ
  • Parcelable ๊ตฌํ˜„ ์ƒ์„ฑ

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด app/build.gradle.kts ํŒŒ์ผ์˜ androidExtensions ๋ธ”๋ก ๋‚ด์—์„œ ์‹คํ—˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

androidExtensions {
 isExperimental = true
}

์ด ๊ตฌ์„ฑ์ด build.gradle.kts ํŒŒ์ผ์— ์ถ”๊ฐ€๋˜๋ฉด Android Extensions ํ”Œ๋Ÿฌ๊ทธ์ธ์— ํฌํ•จ๋œ ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Android view๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Binding views with Kotlin Android Extensions

์‹คํ—˜ ๊ธฐ๋Šฅ์ด ์ผœ์ง€๋ฉด ํ•ฉ์„ฑ ๋ทฐ ๋ฐ”์ธ๋”ฉ์„ ์ฐธ์กฐํ•˜์—ฌ ๋ทฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Android Extensions ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ทฐ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. MainActivity์—์„œ ๋‹ค์Œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ activity_main.xml ํŒŒ์ผ์— ์ •์˜๋œ ๋ฒ„ํŠผ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import kotlinx.android.synthetic.main.activity_main.button

๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ๋‚˜๋ฉด findViewById() ๋˜๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ด๋‹น ๋ทฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

button.apply {
    text = "Hello Kotlin"
    gravity = Gravity.START
    setTextColor(resources.getColor(R.color.colorAccent))
}

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด๊ธฐ ์ด๋ฆ„์€ XML์˜ android:id ์†์„ฑ์— ๋”ฐ๋ผ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฒ„ํŠผ์˜ ID๊ฐ€ '@+id/button'์ด๋ฏ€๋กœ ์ƒ์„ฑ๋œ ๋ฐ”์ธ๋”ฉ์˜ ์ด๋ฆ„์€ ๋ฒ„ํŠผ์œผ๋กœ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ด๋ฆ„๊ณผ ์ถฉ๋Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ import ๋ฌธ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋Œ€์ฒด ์ด๋ฆ„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import kotlinx.android.synthetic.main.activity_main.button as theButton

๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ด์ œ Button์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฒ„ํŠผ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

theButton.apply {
    text = "Hello Kotlin"
    gravity = Gravity.START
    setTextColor(resources.getColor(R.color.colorAccent))
}

ํ•ฉ์„ฑ ๋ทฐ ๋ฐ”์ธ๋”ฉ์€ ์•กํ‹ฐ๋น„ํ‹ฐ ๋ฐ ํ”„๋ž˜๊ทธ๋จผํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์บ์‹ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ๋ทฐ์—์„œ๋„ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Gradle ํŒŒ์ผ์—์„œ androidExtensions ๋ธ”๋ก์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์บ์‹ฑ ์ „๋žต์„ ์ œ์–ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

androidExtensions {
   // HASH_MAP, SPARSE_ARRAY, NONE
   defaultCacheImplementation = "HASH_MAP" 
}

๋ณด๊ธฐ ์ฐธ์กฐ์— Kotlin Android Extensions๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Butterknife ๋˜๋Š” ์—ฌ๋Ÿฌ findViewById() ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•ฉ์„ฑ ๋ฐ”์ธ๋”ฉ(DataBinding, ViewBinding ๋˜๋Š” findViewById())์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ”„๋กœ์ ํŠธ์™€ ๊ธฐ๋ณธ ์„ค์ •์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋ฉฐ ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ํ‰๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Generating Parcelable implementations

Parcelable์€ ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ์ง๋ ฌํ™” API ์ œ๊ณต์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” Android ๊ฐœ๋ฐœ์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. Parcelable ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํ•˜๊ณ  ๋ฐ˜๋ณต์ ์ธ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ง€๋ฃจํ•˜๊ณ  ์ƒ์šฉ๊ตฌ๋กœ ๊ฐ€๋“ ์ฐฌ ์ž‘์—…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ง™๊ฒŒ๋„ Kotlin Android Extensions๋Š” Parcelable ๊ตฌํ˜„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Parcelable์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์— @Parcelize ์ฃผ์„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Parcelize
data class Person(val firstName: String, val lastName: String): Parcelable

@Parcelize ์ฃผ์„์„ ๋ชจ๋ธ ๊ฐœ์ฒด์— ์ถ”๊ฐ€ํ•˜๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•œ Parcelable ๊ตฌํ˜„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๋‹น Parcelable ๊ตฌํ˜„์˜ ๊ตฌํ˜„ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ž˜์Šค์— ํ•„์š”ํ•œ ์ฝ”๋“œ์˜ ์–‘์ด ์ค„์–ด๋“ค๊ณ  ํด๋ž˜์Šค๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค Parcelable ๊ตฌํ˜„์„ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋  ๋•Œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋  ๋•Œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์†์„ฑ ์ˆ˜์ •์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€๋งŒ Parcelable ๊ตฌํ˜„์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

Kotlin Android Extensions ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์„ฑ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ด๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ผ๋ฐ˜์ ์ธ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

Summary

์ด ์žฅ์—์„œ๋Š” Kotlin๊ณผ Android ๊ฐœ๋ฐœ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ดˆ์ฐฝ๊ธฐ๋ถ€ํ„ฐ ์ตœ๊ทผ Google์˜ Kotlin First ๋ฐœํ‘œ๊นŒ์ง€ Kotlin์ด Android์— ์ฑ„ํƒ๋œ ์—ญ์‚ฌ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. Kotlin์„ ์ง€์›ํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด Android ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ Kotlin ๊ด€์šฉ์  Android ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ Android-KTX, Kotlin Android Extensions ๋ฐ Android ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ํŠน์ • Kotlin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋„๊ตฌ๋ฅผ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋„๊ตฌ๊ฐ€ Kotlin์„ ํ™œ์šฉํ•˜์—ฌ Android ๊ฐœ๋ฐœ์„ ๋” ์‰ฝ๊ณ  ์ฆ๊ฒ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์žฅ์—์„œ๋Š” ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•ด Android ์™ธ๋ถ€์—์„œ Kotlin์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Referencs

mastering kotlin

2022.01.01 - [Android/Kotlin] - [์ฝ”ํ‹€๋ฆฐ] ๋” ์ข‹์€ Companion object ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

2021.12.18 - [Android/Jetpack Compose] - [Android] GDG Jetpack compose ์ฝ”๋“œ๋žฉ ์ˆ˜๋ฃŒ ํ›„๊ธฐ (feat. ๊ตฟ์ฆˆ)

2021.11.11 - [SELECT *] - ๊ฐค๋Ÿญ์‹œ ์›Œ์น˜ 4 (์›Œ์น˜ ์‹œ๋ฆฌ์ฆˆ) ๋กค๋ ‰์Šค ํŽ˜์ด์Šค ๋‹ค์šด๋กœ๋“œ (Rolex face)

๋Œ“๊ธ€
๋Œ“๊ธ€์“ฐ๊ธฐ ํผ