[kotlin] 코틀린 리플렉션을 이용한 클래스 필드 추가

코틀린은 리플렉션(Reflection)을 통해 런타임 시점에 클래스의 정보를 검사하고 조작할 수 있는 기능을 제공합니다. 이번 포스트에서는 코틀린 리플렉션을 사용하여 클래스에 필드를 동적으로 추가하는 방법에 대해 알아보겠습니다.

리플렉션(Reflection)이란?

리플렉션은 프로그램이 자신의 구조를 볼 수 있도록 하거나 수정할 수 있도록 하는 런타임 시점의 메타데이터 기능을 의미합니다. 즉, 리플렉션을 이용하면 프로그램이 실행되는 동안 클래스의 정보(필드, 메소드, 생성자 등)를 검사하거나 수정할 수 있습니다.

코틀린에서 클래스 필드 추가하기

코틀린에서는 KClass 인터페이스의 확장 함수를 사용하여 클래스에 필드를 추가할 수 있습니다. 먼저, KClass의 확장 함수 중 하나인 declaredMemberProperties를 사용하여 클래스의 모든 멤버 필드 목록을 가져옵니다. 그런 다음 declaredMemberProperties에서 반환된 리스트에 원하는 필드를 추가하고자 하는 경우에는 MutableListadd 함수를 사용하면 됩니다.

다음은 간단한 예제 코드입니다.

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 인스턴스를 생성하여 반환하는 함수입니다.

마무리

이번 포스트에서는 코틀린 리플렉션을 사용하여 클래스에 필드를 동적으로 추가하는 방법에 대해 알아보았습니다. 리플렉션은 매우 강력한 도구이지만 남용되지 않도록 주의해야 합니다. 안정성과 유지보수성을 고려하여 신중하게 활용해야 합니다.

리플렉션에 대한 자세한 내용은 코틀린 공식 문서를 참고하시기 바랍니다.