[kotlin] 코틀린 리플렉션을 이용한 어노테이션 적용 클래스 필터링

코틀린은 자바와 같이 리플렉션(Reflection)을 지원하여 실행 중에 클래스와 메소드 등을 분석하고 조작할 수 있게 해줍니다. 이 기능을 이용하면 어노테이션을 기반으로 클래스를 필터링하고 필요한 작업을 수행할 수 있습니다. 이번 포스트에서는 코틀린의 리플렉션을 사용하여 어노테이션을 적용한 클래스를 필터링하는 방법을 알아봅니다.

어노테이션 정의하기

우선 필터링하고자 하는 클래스에 적용할 어노테이션을 정의해야 합니다. 어노테이션은 @ 기호를 이용하여 정의하며, 리플렉션을 사용하기 위해서는 런타임 시에도 정보가 유지되어야 하므로 @Retention 어노테이션을 RUNTIME으로 지정해야 합니다. 예를 들어, @MyAnnotation 어노테이션을 다음과 같이 정의할 수 있습니다.

import kotlin.annotation.Retention
import kotlin.annotation.Target

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
annotation class MyAnnotation

리플렉션을 이용한 어노테이션 필터링

이제 리플렉션을 사용하여 클래스의 어노테이션을 필터링할 수 있습니다. 아래 코드는 MyAnnotation 어노테이션이 적용된 클래스들을 필터링하는 예제입니다.

import kotlin.reflect.KClass
import kotlin.reflect.full.findAnnotation

fun findAnnotatedClasses(classes: List<KClass<*>>) : List<KClass<*>> {
    return classes.filter { it.findAnnotation<MyAnnotation>() != null }
}

위 코드에서는 KClass를 이용하여 클래스 정보를 얻고, findAnnotation 메소드를 통해 해당 클래스에 MyAnnotation 어노테이션이 있는지 확인합니다. filter 메소드를 이용하여 어노테이션이 적용된 클래스들을 필터링합니다.

결과 확인하기

이제 위에서 작성한 메소드를 이용하여 클래스들을 필터링하고 결과를 확인해보겠습니다.

fun main() {
    val classes = listOf(ClassWithAnnotation::class, ClassWithoutAnnotation::class, AnotherClassWithAnnotation::class)
    val annotatedClasses = findAnnotatedClasses(classes)
    println(annotatedClasses) // [class ClassWithAnnotation, class AnotherClassWithAnnotation]
}

실행 결과는 MyAnnotation 어노테이션이 적용된 ClassWithAnnotationAnotherClassWithAnnotation 클래스가 출력됩니다.

결론

코틀린의 리플렉션을 이용하면 어노테이션을 적용한 클래스들을 필터링하고 필요한 작업을 수행하는 것이 가능합니다. 이러한 기능을 이용하여 런타임 중에 동적으로 클래스들을 제어하는 다양한 시나리오를 구현할 수 있습니다.

참고 자료