Kotlin 공부(kotlin in action)/10장

2023 01 18 코틀린 공부 - 애노테이션과 리플렉션-2

posite 2023. 1. 18. 15:38

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 메서드를 사용하면 메서드를 사용하면서 디폴트 파라미터값을 사용할 수 있다.