언어/Kotlin

[Kotlin] 속성 위임 정의

implement 2023. 3. 17. 12:00
728x90

반응형

위임은 어떤 클래스의 멤버를 참조 없이 호출하고 싶을 때 사용 하는 선언 방식이다.

 

인터페이스

interface란 구현하는 클래스가 준수 해야하는 규칙을 적어 놓은 클래스이다. 즉, 사전에 메서드와 변수 등을 정의해 놓으면 구현하는 클래스가 그 정의해 놓은 것을 구현해야 한다.

 

위임

위임을 사용하면 실제로 상속하지는 않지만 상속과 비슷한 효과를 낼 수 있다. 즉 클래스의 모든 기능을 사용하는 동시에 기능을 추가로 구현할 수 있다.

위임을 하는 법은 다음과 같다.

var name by 위임객체	//프로퍼티의 값이 변경될때마다 위임객체가 실행된다.
class ClassName(name: String, ic: InterfaceClass) : InterfaceClass by ic {
	...//ic(인터페이스 클래스의 구현클래스 들)안에 있는 멤버들을 바로 사용할 수 있다.
}

 

예제

interface InterfaceClass {
    fun method1()
}//인터페이스 클래스 정의

class ImplementClass : InterfaceClass {
    override fun method1() {
        println("method1이 실행됨")
    }
}//구현 클래스 생성

class DelegatedClass(ic: InterfaceClass) : InterfaceClass by ic {
    fun method2() {
    	method1()
    }
}//위임 받아 메서드 바로 활용

fun main() {
    val name1 = DelegatedClass(ImplementClass())
    name1.method2()
}//"method1이 실행됨"이 출력됨

출력 : "method1이 실행됨"

 

프로퍼티에서의 활용

Kotlin은 var유형의 위임 클래스를 만들때 사용하는 ReadWriteProperty와 val 유형일때의 ReadOnlyProperty라는 인터페이스를 제공하고 있다.

 

ReadWriteProperty

매개변수

T : 위임된 프로퍼티의 타입

V : 프로퍼 값의 타입

 

Kproperty : 선언된 프로퍼티를 나타내는 인터페이스,

thisRef : 요청된 값의 타입

 

예제

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

class RangeAdjuster(
    initialValue: Int,
    private val minValue: Int,
    private val maxValue: Int,
) : ReadWriteProperty<Any?, Int> {
    var fieldData = initialValue

    override fun getValue(thisRef: Any?, property: KProperty<*>): Int {
        return fieldData	//get()
    }

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
        if (value in minValue..maxValue) {
            fieldData = value
        }			//특정 조건일때만 set할 수 있음
    }

}

fun main() {
    var x by RangeAdjuster(2,3,5)
    print(x)
    x = 1
    print(x)
}

 

참고자료

https://developer.android.com/codelabs/ 

https://thinking-face.tistory.com/

반응형