728x90
위임 (Delegation)
- 실세계에서의 위임은 특정 일을 대신하는 중간자 역할
- by를 사용하여 특정 클래스를 확장하거나 이용할 수 있다.
- 하나의 클래스가 다른 클래스에 위임하도록 선언 → 위임된 클래스가 가지는 멤버를 참조없이 호출 가능
- 프로퍼티 위임 : 프로퍼티의 getter, setter를 특정 객체에게 위임하고 그 객체가 값을 읽거나 쓸 때 수행하도록 함
var | val | class 프로퍼티, 클래스 이름 : 자료형 by 위임자
interface P1{
fun talk(){
println("P1 talk")
}
}
class P2 : P1{
}
val p1 = P2()
class P3 : P1 by p1{
}
fun main() {
var p3 = P3()
p3.talk()
}
위임의 목적
- 코틀린의 표준 라이브러리들은 모두 final 형태의 클래스이므로 상속, 직접 클래스의 기능 확장이 어려움 → 무분별한 상속에 따른 복잡한 문제 방지
- 필요한 경우에만 위임을 통해 해당 클래스의 모든 기능을 사용하고 기능 확장이 가능하게 함
observable() 함수 사용
- 프로퍼티를 표준 위임 함수인 observable()로 위임할 수 있다.
- 프로퍼티의 내용이 변경될 때 수행할 작업을 정의할 수 있다.
- 콜백과 동일하다.
import kotlin.properties.Delegates
class P{
var name :String by Delegates.observable("처음"){
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
}
fun main() {
var p = P()
p.name = "두번째"
p.name = "세번째"
/* 결과
처음 -> 두번째
두번째 -> 세번째
*/
}
vetoable() 함수 사용
- observable()과 거의 동일한 역할을 수행하지만 조건에 맞지 않으면 새로운 값 할당을 거부할 수 있다.
- true를 반환하면 새로운 값 할당, false를 반환하면 거부한다.
import kotlin.properties.Delegates
class P{
var age :Int by Delegates.vetoable(0){
property, oldValue, newValue ->
newValue > oldValue//새로운 값이 예전 값보다 큰 경우에만 할당
}
}
fun main() {
var p = P()
p.age = 10
println(p.age)
p.age = 0
println(p.age)
/* 결과
10
10
*/
}
728x90
'Kotlin' 카테고리의 다른 글
[코틀린] 데이터 클래스 (0) | 2020.09.21 |
---|---|
[코틀린] Companion Object, object 선언 (0) | 2020.09.19 |
[코틀린] 프로퍼티의 오버라이딩 (0) | 2020.09.19 |
[코틀린] 주 생성자 (0) | 2020.09.19 |
[코틀린] Unit (0) | 2020.09.19 |
댓글