[Kotlin] Reference and Reflection
필자는 Method Reference에 관하여 종종 많이 접할 수 있다.
안드로이드 스튜디오에서도 객체에 접근하기 위하여
객체::변수명, 객체::함수명
이런식으로 접근하는 걸 볼 수 있다.
오늘은 Reference가 무엇인지 살펴보자.
Property references
class Person(val name: String, var age: Int) {
fun present() = "I'm $name, and I'm $age years old"
fun greet(other: String) = "Hi, $other, I'm $name"
}
fun main() {
val reference = Person::name //methodReference
println("reference $reference")
val noReference = Person("Lisa",32)
noreference.name
}
동일한 property에 관하여 접근해 보았다.
하나는 reference를 사용한 거고, 하나는 다르게 접근한 것이다.
위와 같 main()을 정하고 run()하면 아래와 같이 나타난다.
"Kotlin reflection is not available" 이라고 나와 있는데 속성에 대한 참조를 하는 것을
Property references라고 한다.
-
KProperty
코틀린 공식 문서에 가면
객체의 속성을 상속한 type이며, :: operator로 접근 할 수 있다고 명시되어 있다.
객체의 속성을 읽거나 수정하고 싶다면 2가지 하위 인터페이스를 사용해야 한다.
- KProperty<R,V> //수정 X
- KMutableProperty1<R,V> // 수정 O
모두 제네릭 인터페이스이고 R은 Receiver type(위 예제의 경우에는 Person), V는 속성이다. (Name)
Function references
Function references도 위의 Property references와 비슷하다.
Function reference는 KFunction<V> 인데, V가 function의 return type이다.
val g: KFunction<String> = Person::greet
-
KFucntion
KFucntion은 parameter의 type이 몇개이냐에 따라서 subInterface의 이름이 정해진다.
KFunction1<A, V> -> 1개
KFunction2<A, B, V>-> 2개
KFunction3<A, B, C, V> ->3개
예를 들어 KFunction3<A, B, C, V>이 있다면 순서대로 A,B,C를 매개변수로 사용하고 V를 반환한다.
REF)
* https://kotlinlang.org/docs/tutorials/kotlin-for-py/member-references-and-reflection.html
위 예시는 참고 사이트의 예제를 사용하였습니다.