Kotlin 리플렉션(Reflection) 완벽 가이드 – 클래스 정보 동적 조회와 활용법

✨ 개요

Kotlin 리플렉션(Reflection)은 코드 실행 중에 클래스, 함수, 프로퍼티 등의 정보를 동적으로 조회하거나 조작할 수 있게 해주는 기능입니다. 자바에서도 자주 쓰이지만, Kotlin에서는 더 간결하고 안전하게 사용할 수 있는 방법이 존재합니다.

이번 포스팅에서는 Kotlin 리플렉션의 개념부터 실전 예제, 사용 시 주의사항까지 한 번에 정리해드립니다.

1. Kotlin 리플렉션이란?

📦 Kotlin에서 리플렉션 기능을 사용하려면 다음 의존성이 필요합니다:

// build.gradle.kts
dependencies {
    implementation("org.jetbrains.kotlin:kotlin-reflect")
}

🧪 2. 기본 사용 예제

🔹 클래스 참조 얻기

val clazz = String::class
println(clazz.simpleName)  // 출력: String

🔹 인스턴스로부터 클래스 참조 얻기

val name = "Hello"
val kClass = name::class
println(kClass.qualifiedName) // 출력: kotlin.String

3. 클래스의 프로퍼티와 메서드 접근

📌 프로퍼티 리스트 가져오기

data class User(val name: String, val age: Int)

val props = User::class.members
props.forEach { println(it.name) }

📌 특정 프로퍼티 값 가져오기

val user = User("Joo", 30)
val nameProp = User::name
println(nameProp.get(user)) // 출력: Joo

4. 리플렉션 고급 사용 예제

package org.example.com

import kotlin.reflect.full.createInstance
import kotlin.reflect.jvm.isAccessible


// 1️⃣ 샘플 클래스 정의
class Print {
    fun print() {
        println("Print 클래스의 print() 메소드 실행")
    }
}

class Num {
    fun add(a: Int, b: Int): Int = a + b
}

// 2️⃣ 리플렉션을 이용해 메서드 실행하는 함수
fun invokeMethod(className: String, methodName: String, vararg args: Any?): Any? {
    val clazz = Class.forName(className).kotlin

    // 인스턴스 생성
    val instance = clazz.createInstance()

    // 메서드 찾기
    val method = clazz.members.firstOrNull {
        it.name == methodName && it.parameters.size == args.size + 1 // 첫 파라미터는 instance 자신
    } ?: throw NoSuchMethodException("Method $methodName not found in $className")
    
    method.isAccessible = true

    // 메서드 실행
    return method.call(instance, *args)
}

fun main() {
    // Print 클래스의 print() 메서드 호출
    invokeMethod("org.example.com.Print", "print")

    // Num 클래스의 add(a, b) 메서드 호출
    val result = invokeMethod("org.example.com.Num", "add", 3, 5)
    println("Num 클래스의 add() 결과: $result")
}

5. 리플렉션의 한계 및 주의사항

항목 내용
퍼포먼스 이슈 정적 호출보다 속도가 느림
코드 가독성 저하 가능 동적 호출은 디버깅이 어려움
Proguard 문제 리플렉션 사용하는 클래스가 난독화될 수 있음

✅ 반드시 필요한 경우에만 리플렉션 사용! 남발 금지!

6. 결론

핵심 요약 🔑
Kotlin 리플렉션은 클래스 정보를 동적으로 처리하는 기능
kotlin-reflect 라이브러리 필요
객체 생성, 프로퍼티 조회, 어노테이션 활용에 유용
퍼포먼스와 유지보수 이슈로 과도한 사용은 지양


Related Posts