kotlin 프로퍼티의 getter는 스마트캐스트가 안되고 final 프로퍼티는 되는 이유

이펙티브 코틀린 아이템1 에서 "값을 사용하는 시점에 따라서 다른 결과가 나올 수 있기 때문입니다" 와 함께 보여준 예제가 잘 와닫지 않아서 예제를 만들고 자바로 변환해봄

fun nameOrNullByRandom(): String? {
    return listOf(null, "huni").random()
}

val nameGetter: String?
    get() = nameOrNullByRandom()

val nameFinalProperty: String? = nameOrNullByRandom()

fun main() {
    if(nameGetter != null){
        println(nameGetter!!.length) // 캐스팅 안됌
    }
    if(nameFinalProperty != null){
        println(nameFinalProperty.length)
    }
}
public final class TestKt {
   @Nullable
   private static final String nameFinalProperty = nameOrNullByRandom(); // static final로 한번만 초기화

   @Nullable
   public static final String nameOrNullByRandom() {
      Collection var0 = (Collection)CollectionsKt.listOf(new String[]{(String)null, "huni"});
      return (String)CollectionsKt.random(var0, (Random)Random.Default);
   }

   @Nullable
   public static final String getNameGetter() {
      return nameOrNullByRandom();
   }

   @Nullable
   public static final String getNameFinalProperty() {
      return nameFinalProperty;
   }
}

 getter는 함수이고 매번 호출할때마다 null을 반환할 수 있어서 스마트캐스팅이 불가능함 하지만 final 프로퍼티는 static final 상수에 한번만 초기화 됨으로 매번 값을 읽어도 똑같아서 스마트 캐스팅 가능!

'개발 > kotlin' 카테고리의 다른 글

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