KClass에서 클래스의 모든 함수와 프로퍼티는 KCallable의 인스턴스의 컬렉션 형식이다. KCallable은 함수와 프로퍼트 모두를 포함하는 공통 상위 인터페이스이다. 함수를 호출 할 때는 ::함수이름 의 경우 .invoke()를 통해서 인자를 넘기면 함수가 실행된다. 이때 KFunction의 invoke를 호출하는것이다.
fun foo(x: Int) = println(x)
val kFun = ::foo
kFun.invoke(30)
fun sum(x: Int, y: Int) = x+y
val kF2 : KFunction2<Int,Int,Int> = ::sum
println(kF2.invoke(3,7))
멤버 프로퍼티또한 KProperty로 get, set 메서드를 사용할 수 있다. 아래의 코드의 경우 kPro에 프로퍼티 참조를 저장하면 동적으로 person.age를 가져온다.
val kPro = Person::age
println(kPro.get(person))
이때 kPro의 형식은 KProperty1<Person, Int>로 첫번째가 수신 객체타입, 두번째가 프로퍼티 타입이다. 따라서 Person이 아닌 수신 객체를 넘길 수 없다.
KClass, KCallable, KParameter, KFunction, KProperty.... 등 모두 KAnnotatedElement를 확장한다.
KCallable.callBy 메서드를 사용하면 메서드를 사용하면서 디폴트 파라미터값을 사용할 수 있다.
'Kotlin 공부(kotlin in action) > 10장' 카테고리의 다른 글
2023 01 17 코틀린 공부 - 애노테이션과 리플렉션-1 (0) | 2023.01.17 |
---|