본문으로 건너뛰기

Reflection

1 Reflection

  • 레퍼런스
  • 간단히 말하면 리플렉션이란 실행 시점에 객체의 프로퍼티와 메서드에 접근할 수 있게 해주는 방법이다.
  • 보통은 객체의 메서드나 프로퍼티에 접근할 때는 프로그램 소스 코드 안에 구체적인 선언이 있는 메서드나 프로퍼티 이름을 사용하며 컴파일러는 그런 이름이 실제 가리키는 선언을 컴파일 시점에 찾아내서 해당 선언이 실제 존재함을 보장한다.
  • 하지만 객체가 제공하는 메서드나 프로퍼티 이름을 오직 실행 시점에만 알 수 있는 경우가 있다.
    • 대표적으로 JSON 직렬화 라이러브러리가 있다.
    • 직렬화 라이브러리는 어던 객체든 JSON으로 변활할 수 있어야 하고 실행 시점이 되기 전까지는 직렬화한 프로퍼티나 클래스에 대한 정보가 없기 때문에 이런 경우 리플렉션을 사용한다.

1.1 Reflection 사용하기

  • 코틀린에서 Reflection을 사용하려면 두 가지 서로 다른 Reflection API를 다뤄야 한다.

java.lang.reflect

  • 위 패키지는 자바가 제공하는 표준 리플렉션이다.
  • 코틀린 클래스는 일반 자바 바이트코드로 컴파일되므로 자바 Reflection API도 코틀린 클래스를 컴파일한 바이트코드를 완벽히 지원한다.

kotlin.reflect

  • 위 패키지는 코틀린이 제공하는 Reflection API다.
  • 자바에는 없는 프로퍼티나 널이 될 수 있는 타입과 같은 코틀린 고유 개념에 대한 Reflection을 제공한다.
  • 현재는 자바 Reflection API를 대체할만큼 복잡한 기능을 제공하지 않는다.

2 Kotlin Reflection

  • 코틀린 Reflection API를 사용할 때 처음 접하는 것은 클래스를 표현하는 KClass다.
  • KClass를 사용하면 클래스 안에 있는 모든 선언을 열거하고 각 선언에 접근하거나 클래스의 상위 클래스를 얻는 등의 작업이 가능하다.