Retrofit을 통해 API 인터페이스를 호출 가능한 객체로 바꾸는 과정에서 당연하게 사용하던 :: 심볼에 대한 궁금증이 생겼다..
retrofit.create(UserApi::class.java)
코틀린인데 왜 .java 가 나오고, :: 는 무엇을 의미하는 것 일까?
코드를 작성하는 시점에는 런타임 상 컴파일 된 바이트 코드에서 내가 작성한 코드를 찾을 수가 없다.
즉 런타임에 프로그램의 클래스를 조사하기 위해 사용하는 기술이다.
className:class
instanceName:class
클래스 리플렉션을 바로 불러오거나, 인스턴스를 통해서 가져올 수 있다. 리플렉션은 레퍼런스 객체를 통해서 참조할 수 있는데, 아래와 같이 사용하면 된다.
val kClass: KClass<out className> = className::class
그리고 kClass 라는 레퍼런스 객체 를 통해서, 클래스가 추상클래스인지, 데이터 클래스인지에 대한 정보를 불린 변수로 얻거나, 생성자, 멤버변수들에 대한 정보를 얻을 수 있다.
ex) kClass.isAbstract
kClass.memeberProperties
자바에서의 .class는 Class를 리턴하고, 코틀린에서는 KClass를 리턴한다. 그런데 아래 이미지를 보면, retrofit의 create는 자바 클래스 Class를 필요로 한다.
하지만 걱정할 필요는 없다.
@Suppress("UPPER_BOUND_VIOLATED")
public val <T> KClass<T>.java: Class<T>
@JvmName("getJavaClass")
get() = (this as ClassBasedDeclarationContainer).jClass as Class<T>
위 메서드는, KClass의 확장 프로퍼티이고, .java를 이용해 자바 클래스 타입을 반환한다.
정리하자면, retrofit의 create() 함수의 인자로 자바 클래스 값을 넘기기 위해, 코틀린 리플렉션의 자바 클래스 타입을 얻어온다고 말할 수 있다.
참고 블로그
https://sabarada.tistory.com/190
https://yoon-dailylife.tistory.com/46
열심히 하는 모습 보기좋아요~~ლ(╹◡╹ლ)