kotlin let 블럭안은 스마트 캐스팅이 가능한 이유

class Test(){
    fun hi(){
        println("hi")
    }
}
var test: Test? = Test()

fun ifFunc(){
    if(test != null){
        println(test!!.hi()) // 가변이기 때문에 스마트캐스팅이 불가능
    }
}

fun letFunc(){
    test?.let{it.hi()}
}

이렇게 가변 변수이지만

public static final void ifFunc() {
    if (test != null) {
        Test var10000 = test;
        Intrinsics.checkNotNull(var10000);
        var10000.hi();
        Unit var0 = Unit . INSTANCE;
        System.out.println(var0);
    }

}

public static final void letFunc() {
    Test var10000 = test; // 로컬 변수를 하나 만들고 그걸 사용한다
    if (var10000 != null) {
        Test var0 = var10000;
        int var2 = false;
        var0.hi();
    }
}

로컬변수를 하나 만들고 그것을 사용하기 때문에 스마트캐스팅이 가능하다. 불변 변수라면 불필요한 변수가 만들어지니 if 가 나을수도 있지만 가변은 확실한 장점이 있는 것 같다. 그리고 변수하나 만든다고 성능차이가 심하지 않을것 같아 경우에 따라 코드가 깔끔해지는 쪽으로 작성하면 될 것 같다.