본문 바로가기
Kotlin

[코틀린] 위임 (Delegation)

by Sky Titan 2020. 9. 19.
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

댓글