Kotlin

Kotlin - by(위임), 클래스의 위임 ★

J_Bin 2022. 6. 15. 16:17

 

# 클래스 위임 ★

package chap02.section1

/* 클래스 위임 */

interface Car {
    fun go(): String
}

class VanImpl(val power : String) : Car {
    override fun go() = "은 짐을 적재하며 ${power}을 가집니다."
}

class SportImpl(val power : String) : Car {
    override fun go() = "은 경주용에 사용되며 ${power}을 가집니다."
}

class CarModel(val model : String, impl : Car) : Car by impl {
    fun carInfo() {
        println("$model ${go()}")           // (1) 참조 없이 각 인터페이스 구현 클래스의 go()에 접근
    }
}





fun main() {

    val myDamas = CarModel("Damas 2010",VanImpl("100마력"))

    val my350z = CarModel("350Z 2008",SportImpl("350마력"))

    myDamas.carInfo()           // (2) carinfo에 대한 다형성을 나타냄

    my350z.carInfo()

}

/* impl은 CarModel의 위임되어 각 구현 클래스인 VanImpl과 SportImpl의 go() 메서드를 생성된 위임자에 맞춰 호출 할 수 있습니다.
이 때는 (1)번과 같이 특정 참조 없이 go()를 사용할 수 있습니다. 따라서 (2)번과 같이 이름은 동일하지만 서로 다른 go() 메서드를 호출함으로써 객체 지향의 다형성도 실현된다.
* */

# observable()함수와 vetoable()함수의 사용방법

package chap02.section1

import kotlin.properties.Delegates



/* observable() */
class User {
    var name : String by Delegates.observable("NONAME") {           // (1) 프로퍼티 위임
        prop,old,new ->                     // (2) 람다식 매개변수로 프로펕, 기존 값, 새로운 값 지정
        println("$old -> $new")             // (3) 이 부분은 이벤트가 발생할 때만 실행
    }
}






fun main() {
    val user = User()
    user.name = "kildong"                   // (4) 값이 변경되는 시점에서 첫 이벤트 발생
    user.name = "Dooly"                     // (5) 값이 변경되는 시점에서 두번째 이벤트 발생

    println("------------------------------------------------------------------------")

    /* vetoable() */
    var max : Int by Delegates.vetoable(0) {        // (1) 초기값은 0
        prop,old,new ->
        new > old                                           // (2) 조건에 맞지 않으면 거부권 행사 : 새로운 값이 이전 값보다 큰 경우만 가능
    }

    println(max)                // 0
    max = 10
    println(max)                // 10
    max = 5
    println(max)                // 10
    max = 20
    println(max)                // 20



}