[Kotlin] μμ νλ‘νΌν° (Delegated properties)
#1 Delegated properties
#1-1 κ°μ
Delegated properties | Kotlin
kotlinlang.org
μμ νλ‘νΌν°λ, getterμ setter λ‘μ§μ λ€λ₯Έ ν΄λμ€μ μμ(delegate)νλ μ½νλ¦° νλ‘νΌν°λ₯Ό μλ―Ένλ€. λ³Έ κ²μκΈμμλ μμ νλ‘νΌν°μ κΈ°μ μ λν΄ νꡬνκ³ λ μμ νλ‘νΌν°λ₯Ό κ°λ¨ν ꡬνν΄λ³Έλ€.
#1-2 μμ(delegate)μ μλ―Έ
[Kotlin] νλ‘νΌν°(Property)
#1 νλμ νλ‘νΌν° #1-1 νλ‘νΌν°μ κ°λ // Java String name = "steve"; // Field System.out.println("my name is" + name); name = "kevin"; --- // Kotlin var name : String = "steve" // Property println("my name is" + name) name = "kevin" μ½ν
kenel.tistory.com
μ κ²μκΈμμ 보λ―, μ½νλ¦° νλ‘νΌν°λ λͺ μμ get() λ° set() ꡬ문μΌλ‘ getter λ° setterλ₯Ό 컀μ€ν ν μ μλ€. μ΄ μ»€μ€ν getter λ° setterλ ν΄λΉ κ°μ²΄μ νμ λμ΄ μ μ©λλ€. λ°λΌμ λͺ¨λνλ₯Ό ν΅ν μ¬μ¬μ©μ΄ λΆκ°λ₯νλ€. μ΄ λ μμ νλ‘νΌν°λ₯Ό μ¬μ©ν μ μλ€.
κ·Έλ λ€λ©΄ μμμ΄λ λ¬΄μ¨ μλ―Έλ‘ μ°μΈ λ¨μ΄μΈκ°? μ΄λ€ ν΄λμ€(μ΄ν A ν΄λμ€) νμ μΈ νλ‘νΌν° aκ° μλ€κ³ ν΄λ³΄μ. aμ get() λ° set()μ 컀μ€ν νλ €κ³ νλ€. μ λ§ν¬μ μλ κ²μκΈμ²λΌ get() λ° set()μ νλ‘κ·Έλλ¨Έκ° μ§μ 컀μ€ν νλ λ°©λ²μ΄ μμ κ²μ΄λ€. μ΄ λ κ·Έ λμ λ€λ₯Έ ν΄λμ€(μ΄ν B ν΄λμ€)μ μ μλ getter λ° setterλ₯Ό κ°μ Έμ aμ get() λ° set()μ λμ νλ κ²μ΄ λ°λ‘ 'μμ'μ μλ―Έλ€. λ€μ λ§νμλ©΄ μ΄λ€ κ°μ²΄μ κ°μ μ½κ³ μ°λ λμμ μ§μ ꡬννμ§ μκ³ , λ€λ₯Έ ν΄λμ€μκ² λ§‘κΈ°λ κ²μ΄λ€. λλ¬Έμ ν΄λμ€ Bλ μ½κ³ μ°λ λμμ λν μ°μ°μ μ€λ²λ‘λ© λ©μλκ° λ°λμ μ‘΄μ¬ν΄μΌ νλ€. κ·Έλ¦¬κ³ κ·Έ μ°μ°μ μ€λ²λ‘λ© λ©μλλ operator fun getValue() λ° operator fun setValue()μΌλ‘ μ½μλμ΄ μλ€.
μ£Όμν μ μ, operator fun getValue() λ° operator fun setValue()λ μμ μ μ© μ°μ°μ μ€λ²λ‘λ© λ©μλλΌλ κ²μ΄λ€. μ¦, μ΄ λ©μλλ₯Ό κ°μ§κ³ μλ€κ³ ν΄μ νμμλ ν΄λΉ B ν΄λμ€κ° μ΄ ν΄λμ€λ₯Ό μ΄μ©ν΄ μμ μ κ°μ getνκ±°λ setνμ§λ μλλ€λ μκΈ°λ€. μ€μ§ μμ νλ‘νΌν°μκ² getterμ setterλ₯Ό μ 곡ν λ μ λ¬λλ λͺ©μ μΌλ‘ μ‘΄μ¬νλ λ©μλλ€. λ€μ λ§νμλ©΄ B ν΄λμ€μ get()μ getValue()μ κ΄λ ¨ μλ λ©μλκ³ , λ§μ°¬κ°μ§λ‘ B ν΄λμ€μ set()μ setValue()μλ λ€λ₯Έ λ©μλλ€.
#1-3 μμ(Delegate object) κ°μ²΄: μμ νλ‘νΌν°μ get λ° setμ λμ νλ ν΄λμ€
import kotlin.reflect.KProperty
// ν΄λμ€ B: μμ κ°μ²΄(Delegate object)
class MyDelegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "Delegated property"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("Delegated property never set to $value")
}
}
#1-2μμ λ§ν B ν΄λμ€μ κ°μ₯ κΈ°λ³Έμ μΈ ννλ€. B ν΄λμ€μ κ°μ μν μ μννλ ν΄λμ€λ₯Ό μμ κ°μ²΄(Delegate object)λΌ νλ€. getValue() λ°νν λ° setValue()μ λ§€κ°λ³μ νμ μ 보μ, μ μμ μ½λλ #1-2μμ λ§ν A ν΄λμ€κ° StringμΌ λλ§ μμμ μνν μ μμ κ²μ΄λ€. MyDelegateμκ² get() λ° set()μ μμν String νλ‘νΌν°κ° μ‘΄μ¬νλ€λ©΄ κ·Έ νλ‘νΌν°μ κ°μ "Delegated property"λ‘ μμν κ³ μ λκ³ , μ무리 κ°μ λ°κΎΈλ €λ μλλ₯Ό ν΄λ κ·Έ λλ§λ€ μ½μμ "Delegated property never set to $value"λ₯Ό λ΄λ±μ λΏ μ€μ κ°μ λ°κΏ μλ μμ κ²μ΄λ€.
#1-4 μμ νλ‘νΌν° μ μΈ νμ
val/var <property name>: <Type> by <expression>
#1-2μμ λ§ν νλ‘νΌν° aλ <property name>μ μλ―Ένλ€. Aλ <Type>μ λμλλ€. Bλ <expression>μ λμλλ€. μ΄λ aλ valμΌ μλ μκ³ varμΌ μλ μλλ°, valμΈ κ²½μ° <expression>μ operator fun getValue()λ§μ κ°μΆ°λ λλ€. νμ§λ§ varμ΄λΌλ©΄ μΆκ°λ‘ operator fun setValue()κΉμ§ κ°μΆ°μΌ <property name>μ μμ νλ‘νΌν°λ‘ λ§λ€ μ μλ€.
#2 μ½λ μμ
import kotlin.reflect.KProperty
// ν΄λμ€ B: μμ κ°μ²΄(Delegate object)
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "Delegated property"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("Delegated property never set to $value")
}
}
// νλ‘νΌν° a: μμ νλ‘νΌν°(Delegated property)
var a: String by Delegate()
fun main() {
println(a)
a = "Hello!"
println(a)
}
/* μΆλ ₯ κ²°κ³Ό
Delegated property
Delegated property never set to Hello!
Delegated property
*/
#3 μμ½
μ¬μ¬μ© κ°λ₯ν getter/setter (= μμ κ°μ²΄)λ‘ μμ νλ‘νΌν°λ₯Ό λ§λ€μ΄λΈλ€.