# Table of Contents

# 클래스 참조, Java Class, Kotlin KClass

Java에서는 런타임에 클래스에 대한 정보를 Class클래스에 저장할 수 있다. 이를 클래스 참조(Class Reference)라고 하며, 여러 가지 방법으로 클래스를 참조할 수 있다.

// .class를 사용하여 클래스에서 객체 정보 가져오기
Class clazz = String.class
// forName()메소드를 사용하여 클래스에서 객체 정보 가져오기
Class clazz = Class.forName("java.lang.String");
// 인스턴스로부터 객체 정보 가져오기
String string = new String();
Class clazz = string.getClass();

반면 Kotlin에서는 더블콜론(::)을 사용하여 클래스에 대한 정보를 가져올 수 있다.

// 클래스에서 객체 정보 가져오기
var kclazz: KClass<Person> = Person::class
// 인스턴스에서 객체 정보 가져오기
var kclazz: KClass<Person> = p::class

주의할 점은 Kotlin에서는 Class클래스가 아닌 KClass라는 클래스에 정보가 저장한다는 것이다. 이는 Java에서 사용하는 클래스와 Kotlin에서 사용하는 클래스가 다르기 때문이다.

Kotlin의 Kclass를 Java의 Class로 변환하려면 .java를 뒤에 붙여주면 된다.

var kclazz: KClass<Person> = Person::class
var clazz: Class<Person> = kclazz.java

# 리플렉션(Reflection)

리플렉션(Reflection)은 런타임에서 구체적인 클래스 타입을 몰라도 그 클래스의 멤버변수, 메소드 등에 접근할 수 있도록 하는 API다. 리플렉션은 클래스 참조를 사용하여 구현할 수 있다.

# 리플렉션을 사용하여 멤버 변수 참조

다음과 같은 클래스가 있다고 가정해보자.

class Player {
    var name = "Ronaldo"
    var nation = "Portugal"
    var team = "Juventus"
    var age = 35
}

리플렉션을 사용하면 다음과 같이 클래스의 멤버변수에 접근할 수 있다.

var player: Player = Player()
val kclazz: KClass<Player> = player::class

// KClass를 사용하여 Player 클래스의 멤버변수를 알아내고 있다.
kclazz.memberProperties.forEach {
    print("${it.name} :: ${it.getter.get(p)}")
}

// name :: Ronaldo
// nation :: Portugal
// team :: Juventus
// age :: 35

# 리플렉션을 사용하여 함수 참조

리플렉션은 함수를 참조하는데 사용할 수도 있다.

fun printName(name: String) {
    println(name);
}

// 함수를 변수에 저장하는데 리플렉션 사용
var myFun = ::printName
myFun("ronaldo")  
fun isOdd(x: Int): Boolean {
    return x % 2 !=0
}

val numbers = listOf(1, 2, 3, 4)

// 함수를 함수의 인자로 전달하는데 리플렉션 사용
println(numbers.filter(::isOdd)) 

# 초기화 여부 확인

리플렉션을 사용하여 멤버변수가 초기화되었는지 확인할 수도 있다.

class Phone { ... }

class Person {

    lateinit var phone: Phone
    
    fun getPhone(): Phone {
        //  변수가 초기화 됐는지 확인
        if(::phone.isInitialized) {	
            return phone
        } else {
            this.phone = Phone()
            return phone
        }
    }
}