코틀린에서 by를 이용한 위임에 대해 알아봅니다.
1. 위임(Delegation)
현실에서의 위임(Delegation)이란 특정한 일을 대신하는 중간자의 역할을 말합니다.
코틀린에서도 by를 이용한 위임을 사용해 특정 클래스를 확장하거나 이용할 수 있습니다.
기본적으로 코틀린의 라이브러리는 open 되지 않은 채 제공됩니다. 따라서 상속이나 직접 클래스에 기능 확장이 어렵습니다.
따라서 필요한 경우에만 상속과 비슷하게 위임을 사용하여 해당 클래스의 모든 기능을 사용하면서 기능을 추가 확장 구현을 가능하게 합니다.
2. by에 의한 클래스 위임
by를 사용하면 하나의 클래스가 다른 클래스에 위임 하도록 선언할 수 있습니다.
위임이 선언되면 위임된 클래스가 가지는 멤버를 참조없이 호출할 수 있게 됩니다.
다음 예시를 통해 by를 이용한 클래스 위임에 대해 알아봅시다.
interface Car { fun go(): String }
class VanImpl(val power: String): Car{
override fun go() = "은 짐을 적재하며 $power 을 가집니다."
}
class SportImpl(var power: String): Car{
override fun go() = "은 경주용에 사용되며 $power 을 가집니다."
}
class CarModel(var model: String, impl: Car): Car by impl{
fun carInfo(){ println("$model ${go()}") }
}
fun main(){
var myDamas = CarModel("Damas", VanImpl("100마력"))
var my350z = CarModel("350z", SportImpl("350마력"))
myDamas.carInfo()
my350z.carInfo()
}
- VanImpl / SportImpl : Car 인터페이스를 상속받아 구현합니다.
- Car by impl : 인자 impl은 CarModel에 의해 위임됩니다. 타입이 Car이므로 특정 참조 없이 Car의 멤버를 사용할 수 있게 됩니다.
위 예시의 실행결과는 다음과 같습니다.
3. observable() 함수에 의한 위임
observable() 함수는 특정 프로퍼티를 감시하고 있다가 변화가 감지되면 호출되어 처리됩니다.
특정 변경 이벤트에 따라 호출되므로 콜백이라고 부르기도 합니다.
다음 예시를 통해 observable() 함수의 사용법에 대해 알아보겠습니다.
import kotlin.properties.Delegates
class User{
var name: String by Delegates.observable("NONAME"){
prop, old, new -> println("$old -> $new")
}
}
fun main(){
var user = User()
user.name="smoh"
user.name="Anonymous"
}
- by Delegates.observable("NONAME") : 해당 프로퍼티에 obervable 함수로 위임합니다. 초깃값은 "NONAME"으로 설정합니다.
- new -> println("$old -> $new") : 프로퍼티의 변경이 감지되면 new에 할당되어 있는 람다식이 실행됩니다.
위의 함수를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
User클래스의 name이 변경될 때마다 지정해둔 람다식이 실행된 것을 알 수 있습니다.
4. vetoable() 함수에 의한 위임
obervable() 함수와 유사한 함수입니다. 프로퍼티 값이 변경되면 호출되며 콜백이 true값을 반환할 때 만 프로퍼티를 업데이트합니다.
다음 예시를 통해 알아보겠습니다.
import kotlin.properties.Delegates
fun main() {
var max: Int by Delegates.vetoable(0){
prop, old, new -> new > old
}
println(max)
max = 10
println(max)
max = 5
println(max)
}
- by Delegates.vetoable(0) : 해당 프로퍼티에 vetoable() 함수로 위임합니다. 초깃값은 0으로 설정합니다.
- new -> new > old : 콜백 함수입니다. 해당 조건이 true로 리턴되면 new값을 prop에 새로 저장합니다.
위 함수를 실행한 결과는 다음과 같습니다.
초깃값은 0으로 초기화됩니다. 이후 10은 0보다 크니까 프로퍼티 값에 저장합니다. 그다음 5는 10보다 작으므로 프로퍼티 값을 경신하지 않습니다.
'Programming' 카테고리의 다른 글
[Kotlin] 30. 추상 클래스 (0) | 2019.09.05 |
---|---|
[Kotlin] 29. 컴패니언 객체 (0) | 2019.09.01 |
[Kotlin] 27. 지연 초기화: lazy (0) | 2019.08.27 |
[Kotlin] 26. 지연초기화: lateinit (0) | 2019.08.27 |
[Kotlin] 25. Custom Getter & Setter (0) | 2019.08.27 |