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)
}
참고자료
반응형
'언어 > Kotlin' 카테고리의 다른 글
| [Kotlin] 제네릭, enum 클래스, 데이터 클래스 (0) | 2023.03.31 |
|---|---|
| [Kotlin] 함수 유형 및 람다 표현 (1) | 2023.03.24 |
| [Kotlin] 공개 상태 (0) | 2023.03.10 |
| [Kotlin] 클래스 관계 (0) | 2023.03.03 |
| [Kotlin] 클래스 생성 , 생성자 (0) | 2023.02.28 |