Kotlin/포스팅

코틀린 리플렉션 호출 가능

짜집퍼박사(짜박) 2024. 1. 3. 00:07

코틀린 리플렉션을 사용하여 함수를 호출하는 데는 call 메서드가 사용됩니다. call 메서드는 KFunction 인터페이스에 속하며, 함수를 동적으로 호출하는 데 사용됩니다. 여러 유형의 함수 호출 및 관련된 내용에 대해 자세히 살펴보겠습니다.

 

1. 일반 함수 호출

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

fun greet(person: Person): String {
    return "Hello, ${person.name}! You are ${person.age} years old."
}

fun main() {
    val person = Person("Alice", 30)
    val kFunction = ::greet

    // 일반 함수 호출
    val result: String = kFunction.call(person)
    println(result)
}

 

2. 멤버 함수 호출

data class Person(val name: String, val age: Int) {
    fun greet(): String {
        return "Hello, $name! You are $age years old."
    }
}

fun main() {
    val person = Person("Bob", 25)
    val kFunction = Person::greet

    // 멤버 함수 호출
    val result: String = kFunction.call(person)
    println(result)
}

 

3. 확장 함수 호출

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

fun Person.greet(): String {
    return "Hello, $name! You are $age years old."
}

fun main() {
    val person = Person("Charlie", 35)
    val kFunction = Person::greet

    // 확장 함수 호출
    val result: String = kFunction.call(person)
    println(result)
}

 

4. 생성자 호출

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

fun main() {
    val kClass = Person::class
    val constructor = kClass.primaryConstructor

    // 생성자 호출
    val person: Person = constructor!!.call("David", 40)
    println(person)
}

 

5. 디스패치 가능한 호출

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

fun greet(person: Person): String {
    return "Hello, ${person.name}! You are ${person.age} years old."
}

fun greetWithDefault(person: Person, greeting: String = "Hello"): String {
    return "$greeting, ${person.name}! You are ${person.age} years old."
}

fun main() {
    val person = Person("Eva", 28)
    val kFunction = ::greet

    // 디스패치 가능한 호출 (변경 가능한 인수 목록)
    val result1: String = kFunction.call(person)
    val result2: String = kFunction.callBy(mapOf("person" to person))
    println(result1)
    println(result2)

    val kFunctionWithDefault = ::greetWithDefault

    // 디스패치 가능한 호출 (기본값 사용)
    val result3: String = kFunctionWithDefault.call(person)
    val result4: String = kFunctionWithDefault.callBy(mapOf("person" to person, "greeting" to "Hi"))
    println(result3)
    println(result4)
}

callBy 메서드를 사용하여 디스패치 가능한 호출을 할 때, 매개변수 이름과 값을 매핑한 Map을 전달할 수 있습니다.

 

6. 반환 타입 처리

call 메서드는 반환 타입이 Any로 지정되어 있습니다. 반환 타입이 알려진 경우 call의 반환 값을 해당 타입으로 캐스팅할 수 있습니다

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

fun greet(person: Person): String {
    return "Hello, ${person.name}! You are ${person.age} years old."
}

fun main() {
    val person = Person("Frank", 45)
    val kFunction = ::greet

    // 반환 타입 캐스팅
    val result: String = kFunction.call(person) as String
    println(result)
}

이러한 예제를 통해 코틀린 리플렉션을 사용하여 함수를 동적으로 호출하는 여러 방법을 살펴보았습니다. 주의할 점은 리플렉션을 사용할 때 예외 처리와 안전한 캐스팅을 신중하게 다뤄야 한다는 것입니다. 가능하면 리플렉션 없이 코드를 작성하는 것이 좋습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 단항 연산  (0) 2024.01.03
코틀린 연산자 오버로딩  (0) 2024.01.03
코틀린 리플렉션 지정자와 타입  (0) 2024.01.03
코틀린 리플렉션 API  (0) 2024.01.03
코틀린 리플렉션  (0) 2024.01.02