[kotlin] 코틀린 리플렉션을 이용한 inner 클래스 접근

코틀린은 안드로이드 및 서버사이드 애플리케이션을 개발하고자 하는 개발자들에게 매우 인기 있는 언어입니다. 이번 포스트에서는 코틀린의 리플렉션을 사용하여 inner 클래스에 접근하는 방법에 대해 알아보겠습니다.

inner 클래스란 무엇인가?

먼저, inner 클래스에 대해 간단히 알아보겠습니다. inner 클래스란 다른 클래스 내에 선언된 클래스로, 바깥쪽 클래스의 멤버에 접근할 수 있습니다.

코틀린 리플렉션

코틀린 리플렉션은 런타임에 객체의 속성 및 메소드에 접근하여 조작할 수 있도록 해주는 기능입니다.

리플렉션을 사용하여 inner 클래스에 접근하기 위해서는 아래의 예시 코드처럼 바깥쪽 클래스의 인스턴스를 통해 inner 클래스에 접근할 수 있습니다.

class Outer {
    private val value: String = "Outer class"
    
    inner class Inner {
        fun getValueFromOuter(): String {
            return this@Outer.value
        }
    }
}

fun main() {
    val outer = Outer()
    val inner = outer.Inner()
    print(inner.getValueFromOuter())
}

위의 코드에서 inner 클래스 인스턴스를 생성하기 위해 outer.Inner()를 사용했습니다. 그리고 getValueFromOuter 메소드를 호출하여 바깥쪽 클래스의 value 멤버에 접근했습니다.

코틀린 리플렉션으로 inner 클래스에 접근하기

리플렉션을 사용하여 inner 클래스에 접근하기 위해서는 javaClass 프로퍼티를 이용하여 inner 클래스의 KClass 객체를 가져온 후 인스턴스를 생성해야 합니다.

fun main() {
    val outer = Outer()
    val innerClass = Outer::class.java.declaredClasses.find {
        it.simpleName == "Inner"
    }
    val innerInstance = outer::class.java.getDeclaredConstructor(innerClass!!.enclosingClass)
        .newInstance(outer)
    val method = innerClass!!.getDeclaredMethod("getValueFromOuter")
    val result = method.invoke(innerInstance)
    println(result)
}

위의 코드에서는 Outer 클래스의 javaClass 프로퍼티를 통해 inner 클래스의 KClass 객체를 가져와서, 리플렉션을 통해 inner 클래스의 인스턴스를 생성하고, 메소드를 호출하여 결과를 출력하는 방법을 보여주고 있습니다.

리플렉션을 사용하면 inner 클래스에 접근하여 해당 메소드를 호출할 수 있습니다. 그러나 리플렉션은 런타임 오버헤드가 크기 때문에 가능한 한 사용을 최소화 하는 것이 좋습니다.

이상으로 코틀린에서 inner 클래스에 리플렉션을 이용한 접근 방법에 대해 알아보았습니다. 이를 통해 코틀린 개발 시 inner 클래스에 접근하는데 필요한 기본적인 지식을 습득할 수 있을 것입니다.

참고 자료