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
}