코틀린은 리플렉션(Reflection)을 통해 런타임 시점에 클래스의 정보를 검사하고 조작할 수 있는 기능을 제공합니다. 이번 포스트에서는 코틀린 리플렉션을 사용하여 클래스에 필드를 동적으로 추가하는 방법에 대해 알아보겠습니다.
리플렉션(Reflection)이란?
리플렉션은 프로그램이 자신의 구조를 볼 수 있도록 하거나 수정할 수 있도록 하는 런타임 시점의 메타데이터 기능을 의미합니다. 즉, 리플렉션을 이용하면 프로그램이 실행되는 동안 클래스의 정보(필드, 메소드, 생성자 등)를 검사하거나 수정할 수 있습니다.
코틀린에서 클래스 필드 추가하기
코틀린에서는 KClass
인터페이스의 확장 함수를 사용하여 클래스에 필드를 추가할 수 있습니다. 먼저, KClass
의 확장 함수 중 하나인 declaredMemberProperties
를 사용하여 클래스의 모든 멤버 필드 목록을 가져옵니다. 그런 다음 declaredMemberProperties
에서 반환된 리스트에 원하는 필드를 추가하고자 하는 경우에는 MutableList
의 add
함수를 사용하면 됩니다.
다음은 간단한 예제 코드입니다.
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.full.createInstance
fun main() {
val personClass = Person::class
val person = personClass.createInstance()
with(person) {
val newField = "new value"
val newFieldName = "newField"
this::class.declaredMemberProperties.toMutableList().add(
KPropertyImpl(newFieldName, { newField })
)
}
}
class Person
위 코드에서 Person
클래스에 newField
라는 필드가 추가됩니다. 여기서 KPropertyImpl
은 추가하고자 하는 필드의 이름과 값을 받아 새로운 KProperty
인스턴스를 생성하여 반환하는 함수입니다.
마무리
이번 포스트에서는 코틀린 리플렉션을 사용하여 클래스에 필드를 동적으로 추가하는 방법에 대해 알아보았습니다. 리플렉션은 매우 강력한 도구이지만 남용되지 않도록 주의해야 합니다. 안정성과 유지보수성을 고려하여 신중하게 활용해야 합니다.
리플렉션에 대한 자세한 내용은 코틀린 공식 문서를 참고하시기 바랍니다.