[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

좋은 웹페이지 즐겨찾기