Reflection은 거의 모든 언어에는 없고 자바에는 있는 기능으로서 프로그램 내부 속성을 조작할 수 있게 하는 자바 API입니다.
클래스로 예를 들면, 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수 등에 접근할 수 있도록 해줍니다.(private으로 선언되어 있어도 접근 가능)
물론 자바와 호환이 되는 코틀린에서도 사용이 가능합니다.
이번 글에서는 코틀린으로 예제를 작성해보겠습니다.
gyul.songgyubin.daytogo.models 패키지 아래에 User라는 data class를 선언했습니다.
val clazz = User::class.java
println(clazz.toGenericString())
이에 대한 결과는
이렇게 해당 클래스에 대한 정보를 얻을 수 있습니다.
또한, 클래스에 선언된 메서드 및 변수들의 정보들도 얻을 수 있습니다.
User 클래스에는 uid:String 과 email:String 이라는 프로퍼티가 있습니다.
data class는 아시겠지만, 자동으로 getter와 setter를 만들어주죠.
이러한 특성을 이용해서 getter를 호출해보겠습니다.
val method = clazz.getMethod("getUid")
println(method.invoke(User("myUid","myEmail")))
아래처럼 uid에 넣은 값이 제대로 출력되고 있는 것을 확인할 수 있습니다.
위에서 말했다시피 User클래스에는 uid와 email이 있습니다.
이러한 필드명을 가져올 수도 있습니다.
val fields = clazz.declaredFields
fields.forEach {
println(it.toGenericString())
}
하지만 리플렉션은 비용이 큰 작업이므로 정말 필요할 때만 사용하면 좋을 것 같습니다 :)
이렇게 유용한 기능으로 이번에 앱 개발을 하면서 문제를 하나 해결했는데요.
궁금하시다면 여기로(Mapper 참고) 오셔서 한 번 읽어보시기 바랍니다.