#34 Kotlin Koans Properties/Delegates examples 해설

1 소개



Kotlin 공식 레퍼런스의 Kotlin Koans Properties/Delegates examples의 해설 기사입니다.

Kotlin Koans를 통해 Kotlin을 배우는 사람들의 도움이 되길 바랍니다.

다만, 레퍼런스를 자력으로 읽는 힘을 기르고 싶은 분은,
곧이 기사를 보지 마십시오!

일단 각자 도전하고 나서 볼 수 있다고 생각합니다

2 Delegated Properties/Lazy



Delegated Propertiesval/var <property name>: <Type> by <expression> 로 표현되는, 프로퍼티의 참조 방법입니다.

아래에서 참조 예제를 살펴 보겠습니다.

Delegates_example
import kotlin.reflect.KProperty

class Example {
    var p: String by Delegate()
}

val e = Example()
println(e.p)

e.p = "NEW"

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, thank you for delegating '${property.name}' to me!"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name}' in $thisRef.")
    }
}


Example 클래스에는 String 형식의 Delegated property p가 있습니다.

Example()은 Example 유형의 인스턴스를 생성하고 변수 e에 할당합니다.

println(e.p)에서 Example 클래스의 속성 p를 참조합니다.

이 때, 통상의 프로퍼티이면 게터가 불려 가 (보통은 생략되고 있다) 반환값이 e.p에 돌아옵니다만, Delegate()로 Delegate형의 인스턴스가 생성되는 것으로, getValue()( get()에 해당)이 호출됩니다.

getValue() 의 제 1 인수에는 p를 호출한 인스턴스의 e 가 건네받고, 제 2 인수에는 p 자신이 건네받습니다.

한편, e.p = "NEW"로 p에 값을 대입하려고 하면, Delegate()에 의해 setValue()(set()에 상당)가 불려 갑니다.

setValue()의 제1 인수와 제2 인수에는 getValue()와 같이 e와 p가 대입되어 제3 인수에는 대입하려고 하고 있던 "NEW"가 건네받습니다.

이상의 Delegate 클래스를 이용한, Delegate property의 참조는 자작의 클래스를 이용하고 있었습니다만,

Kotlin 라이브러리에는 기본적으로 제공되는 클래스가 있습니다.

그 중 하나가 Lazy 클래스이고 lazy()에서 인스턴스를 생성합니다.

lazy() 인스턴스에는 initializer라는 람다 식을 건네주고, 반환값의 인스턴스가 람다식의 반환값의 정보를 보관 유지하고 있습니다.

lazy() 로 처음 참조한 프로퍼티의 정보는 보존되므로, 다음번 이후의 참조에서는 보존된 정보가 호출하에 돌려주어집니다.

(실례는 이하의 해설로 나타냅니다.)

3 Properties/Delegates examples 설명



Kotlin Koans Properties/Delegates examples 의 해설입니다.
수시로 본 사이트의 내용을 인용하겠습니다.

본문과 코드를 살펴보자.

Read about delegated properties and make the property lazy by using delegates.

Delegates_examples
class LazyProperty(val initializer: () -> Int) {
    val lazyValue: Int by TODO()
}

#33 Kotlin Koans Properties/Lazy property 해설 에서 lazy 속성을 구현하는 방법을 lazy()를 사용하여 다시 작성합니다.

lazyValue가 참조되었을 때 lazy()를 사용하여 Lazy 인스턴스를 생성하고 인수에는 initializer를 전달하면 되므로 다음과 같은 구현이 됩니다.

Delegates_example
class LazyProperty(val initializer: () -> Int) {
    val lazyValue: Int by lazy(initializer)
}

4 마지막으로



다음은 Kotlin Koans Properties/Delegates how it works의 해설을합니다.

좋은 웹페이지 즐겨찾기