property
์ฝํ๋ฆฐ ํ๋กํผํฐ ์์: by
ํค์๋๋ก ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ๋์ด๊ธฐ
by
ํค์๋๋ก ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ๋์ด๊ธฐ์ฝํ๋ฆฐ์ **ํ๋กํผํฐ ์์(Delegated Properties)**์ ๊ฐ์ฒด์ ํน์ ๋์์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์ํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ค์ด๊ณ , ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ ํ๋กํผํฐ ์์์ด ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
ํ๋กํผํฐ ์์์ด๋?
ํ๋กํผํฐ ์์์ by
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กํผํฐ์ get()
๊ณผ set()
์ ๊ทผ์ ๋ก์ง์ ๋ณ๋์ ๊ฐ์ฒด(๋ธ๋ฆฌ๊ฒ์ดํธ)์ ๋งก๊ธฐ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ฆ, ๊ฐ๋ฐ์๋ ํ๋กํผํฐ์ ๊ฐ์ ์ง์ ๊ด๋ฆฌํ๋ ๋์ , get
๊ณผ set
์ ๋์์ ์ ์ํ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๋ฅผ ์ง์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var <property name>: <Type> by <expression>
์ฌ๊ธฐ์ <expression>
์ **getValue
**์ setValue
(var์ ๊ฒฝ์ฐ) ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด์
๋๋ค. ์ฝํ๋ฆฐ์ ์ด ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ์ฌ ํ๋กํผํฐ์ ๊ฐ์ ์ฝ๊ณ ์๋๋ค.
ํ๋กํผํฐ ์์์ ํต์ฌ: ReadOnlyProperty
์ ReadWriteProperty
์ธํฐํ์ด์ค
ReadOnlyProperty
์ ReadWriteProperty
์ธํฐํ์ด์คํ๋กํผํฐ ์์์ ์ฌ์ฉ๋๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๋ ํน์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
ReadOnlyProperty
:val
(์ฝ๊ธฐ ์ ์ฉ) ํ๋กํผํฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋getValue
๋ฉ์๋๋ง ์ ์ํฉ๋๋ค.interface ReadOnlyProperty<in T, out V> { operator fun getValue(thisRef: T, property: KProperty<*>): V }
ReadWriteProperty
:var
(์ฝ๊ธฐ/์ฐ๊ธฐ ๊ฐ๋ฅ) ํ๋กํผํฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ **getValue
**์setValue
๋ฉ์๋๋ฅผ ๋ชจ๋ ์ ์ํฉ๋๋ค.interface ReadWriteProperty<in T, out V> { operator fun getValue(thisRef: T, property: KProperty<*>): V operator fun setValue(thisRef: T, property: KProperty<*>, value: V) }
์ฝํ๋ฆฐ ์ปดํ์ผ๋ฌ๋ ์์๋ ํ๋กํผํฐ๋ฅผ ๋ง๋ฌ์ ๋, ๋ด๋ถ์ ์ผ๋ก ์ด ๋ฉ์๋๋ค์ ํธ์ถํ์ฌ ์ค์ ๋ก์ง์ ์คํํฉ๋๋ค.
์ฝํ๋ฆฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉํ ์์๋ค
์ฝํ๋ฆฐ์ ์์ฃผ ์ฌ์ฉ๋๋ ์์ ํจํด์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํฉ๋๋ค.
1. lazy
์์: ์ง์ฐ ์ด๊ธฐํ
**lazy
**๋ ํ๋กํผํฐ์ ๊ฐ์ด ์ฒ์ ์ฌ์ฉ๋ ๋ ์ด๊ธฐํ๋๋ ์ง์ฐ ์ด๊ธฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ฆฌ์์ค ์๋ชจ๊ฐ ํฐ ๊ฐ์ฒด๋ฅผ ํ์ํ ๋๋ง ์์ฑํ๊ณ ์ถ์ ๋ ์ ์ฉํฉ๋๋ค.
val expensiveProperty: String by lazy {
println("๊ฐ ์ด๊ธฐํ ์ค...")
"์ด๊ธฐํ๋ ๊ฐ"
}
fun main() {
println(expensiveProperty) // "๊ฐ ์ด๊ธฐํ ์ค..." ์ถ๋ ฅ ํ "์ด๊ธฐํ๋ ๊ฐ" ์ถ๋ ฅ
println(expensiveProperty) // ์ด๋ฏธ ์ด๊ธฐํ๋์ด ์์ผ๋ฏ๋ก, ๊ฐ๋ง ์ถ๋ ฅ
}
lazy
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ๊ฒ ๋์ํ๋ฉฐ, LazyThreadSafetyMode
๋ฅผ ํตํด ๋์ ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
2. Delegates.observable
์ Delegates.vetoable
์ด ์์๋ค์ ํ๋กํผํฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ํน์ ๋ก์ง์ ์คํํ๋ ์ต์ ๋ฒ ํจํด์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Delegates.observable
: ๊ฐ์ด ๋ณ๊ฒฝ๋ ํ์ ์ฝ๋ฐฑ์ ํธ์ถํฉ๋๋ค.import kotlin.properties.Delegates var name: String by Delegates.observable("์ด๊ธฐ๊ฐ") { prop, old, new -> println("์ด๋ฆ์ด '$old'์์ '$new'๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.") } fun main() { name = "์ฝํ๋ฆฐ" // ์ถ๋ ฅ: ์ด๋ฆ์ด '์ด๊ธฐ๊ฐ'์์ '์ฝํ๋ฆฐ'๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. }
Delegates.vetoable
: ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ์ฝ๋ฐฑ์ ํธ์ถํ๋ฉฐ, ๋ณ๊ฒฝ์ ์ทจ์ํ ์ ์์ต๋๋ค. ์ฝ๋ฐฑ์ดfalse
๋ฅผ ๋ฐํํ๋ฉด ๊ฐ ๋ณ๊ฒฝ์ด ์ทจ์๋ฉ๋๋ค.import kotlin.properties.Delegates var isEnabled: Boolean by Delegates.vetoable(false) { prop, old, new -> println("์ํ ๋ณ๊ฒฝ ์๋: $old -> $new") new // true๋ฅผ ๋ฐํํด์ผ๋ง ๊ฐ์ด ๋ณ๊ฒฝ๋จ }
3. Delegates.notNull
์ด๊ธฐํ๊ฐ ๋์ค์ ์ด๋ฃจ์ด์ง์ง๋ง null
์ด ๋ ์ ์๋ var
ํ๋กํผํฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ง์ฝ ์ด๊ธฐํ ์ ์ ์ ๊ทผํ๋ฉด IllegalStateException
์ ๋ฐ์์์ผ ์์ ์ฑ์ ๋์ฌ์ค๋๋ค.
์ปค์คํ
ํ๋กํผํฐ ์์ ๋ง๋ค๊ธฐ
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ธ์๋, ์ง์ getValue
์ setValue
๋ฅผ ๊ตฌํํ์ฌ ์ปค์คํ
๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์์: ๋ก์ปฌ ์ ์ฅ์์ ๊ฐ์ ์ ์ฅํ๋ ์์
import kotlin.reflect.KProperty
class LocalStorageDelegate(private val key: String, private val defaultValue: String) {
// SharedPreferences ๋ฑ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์
private val storage = mutableMapOf<String, String>()
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("'$key'์์ ๊ฐ ์ฝ๊ธฐ")
return storage[key] ?: defaultValue
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("'$key'์ '$value' ์ฐ๊ธฐ")
storage[key] = value
}
}
class UserSettings {
var username: String by LocalStorageDelegate("username", "Guest")
}
fun main() {
val settings = UserSettings()
println(settings.username) // ์ถ๋ ฅ: 'username'์์ ๊ฐ ์ฝ๊ธฐ, Guest
settings.username = "Alice" // ์ถ๋ ฅ: 'username'์ 'Alice' ์ฐ๊ธฐ
println(settings.username) // ์ถ๋ ฅ: 'username'์์ ๊ฐ ์ฝ๊ธฐ, Alice
}
์ด์ฒ๋ผ ํ๋กํผํฐ ์์์ ์ฌ์ฉํ๋ฉด ๋ก๊น , ๋ฐ์ดํฐ ์ ์ฅ, ์ค๋ ๋ ๊ด๋ฆฌ ๋ฑ ๋ค์ํ ๋ก์ง์ ํ ๊ณณ์ ๋ชจ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
Last updated