[Kotlin] Kotlin Study #10

이제일·2023년 9월 24일
0

Kotlin

목록 보기
7/10

위임 패턴(delegate pattern)

  • 객체가 자신의 기능을 다른 객체에게 위임하여 기능을 실행하는 디자인 패턴
  • 코틀린에선 by 키워드를 사용하여 쉽게 구현 가능

클래스 위임

  • 객체가 자신의 기능을 다른 객체에게 위임하여 기능을 실행하는 디자인 패턴
  • 코틀린에선 by 키워드를 사용하여 쉽게 구현 가능
interface Base { 
	fun say() 
}

class BaseImpl(private val x: Int) : Base {
    override fun say() { 
    	println(x.toString()) 
    }
}

class Derived(private val b: BaseImpl) : Base {
    override fun say() { 
    	b.say() 
    }
}

class Derived2 : Base by BaseImpl(10)

fun main() {
    val b = BaseImpl(10)
    Derived(b).say() // print: 10
    Derived2().say() // print: 10
}

생성자의 매개변수 속성으로 위임

  • 주 생성자의 속성의 자료형을 인터페이스로 작성.
interface Base { 
	fun say() 
}

class BaseImpl(private val x: Int) : Base {
    override fun say() { 
    	println(x.toString()) 
    }
}

class Derived(private val b: BaseImpl) : Base {
    override fun say() { 
    	b.say() 
    }
}

class Derived2(baseImpl: Base) : Base by baseImpl

fun main() {
    Derived2(BaseImpl(10)).say() // print: 10
    Derived2(Derived(10)).say() // print: 10
}

여러 인터페이스로 위임

interface Showable {
    fun show()
}
interface Viewable{
	fun view()
}
class Show: Showable {
    override fun show() {
        println("Show-show()")
    }
}
class View: Viewable {
    override fun view() {
        println("View-view()")
    }
}
class Screen (
	val showable: Showable, val viewable : Viewable
): Showable by showable, Viewable by viewable

fun main() {
    val show = Show()
    val view = View()
    Screen(show, view).show() // print: Show-show()
    Screen(show, view).view() // print: View-view()
}

속성 위임

속성을 위임을 처리하는 메서드에는 notNull observable vetoable 가 있다.

notNull : 클래스 멤버인 속성의 지연 초기화

  • 객체 생성 시점이 아닌 나중에 초기화 되는 읽기/쓰기 프로퍼리를 가진 프로퍼티 대리자 반환
import kotlin.properties.Delegates 

...

lateinit var str: String

fun main() {
    var str1: String by Delegates.notNull<String>()
    var int1: Int by Delegates.notNull<Int>()

	str = "Hello"
    str1 = "World"
    int1 = 10
}

observable : 속성 변경 관찰

  • 프로퍼티 위임을 처리할 때 해당 프로퍼티가 변경되는 상태를 관찰
import kotlin.properties.Delegates
...
fun main() {
    var observed = false
    var max: Int by Delegates.observable(0) { _, old, new -> 
        println("Old value: $old,New value: $new")
        observed = true // 변경 상태 변경
    }

    println("max: $max") // max: 0
    println("observed: $observed") // observed: false

    max = 10 // print:  Old value: 0,New value: 10
    println("max: $max") // max: 10
    println("observed: $observed") // observed: true
}

vetoable : 특정 조건이 일치할 때만 속성 위임 변경

  • 프로퍼티의 값이 변경되기 전에 조건 검사 및 변경을 막을 수 있는 프로퍼티를 생성
import kotlin.properties.Delegates
...
fun main() {
    var vetoableField: Int by Delegates.vetoable(0) { property, oldValue, newValue ->
        println("vetoableField: $oldValue -> $newValue")
        newValue >= 0
    }

    println(vetoableField) // 0

    vetoableField = 1 //print:   vetoableField: 0 -> 1

    println(vetoableField) // 1

    vetoableField = -1 //print:   vetoableField: 1 -> -1

    println(vetoableField) // 1
}
profile
세상 제일 이제일

0개의 댓글