[Android] 코틀린 ::class.java는 무엇일까?
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
그래서 .java는 뭔데?
* 코틀린에서 쓰는 클래스와, 자바에서 쓰는 클래스는 다르다!
자바에서의 .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를 이용해 자바 클래스 타입을 반환한다.
즉, .java를 이용하여 KClass로부터 자바 클래스 값을 받아올 수 있는 것이다.
정리하자면, retrofit의 create() 함수의 인자로 자바 클래스 값을 넘기기 위해, 코틀린 리플렉션의 자바 클래스 타입을 얻어온다고 말할 수 있다.
참고 블로그
https://sabarada.tistory.com/190
https://yoon-dailylife.tistory.com/46
Author And Source
이 문제에 관하여([Android] 코틀린 ::class.java는 무엇일까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@evergreen_tree/Android-코틀린-class.java는-무엇일까저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)