Kotlin에서 const val과 val은 모두 재할당이 불가능한 값이다.
하지만 두 키워드는 컴파일 타임 상수 여부와 JVM 바이트코드 생성 방식에서 큰 차이가 있다.
valval은 읽기 전용 프로퍼티 (read-only property) 이다.
val name = "John"
val currentTime = System.currentTimeMillis()
const val 이란?const val은 컴파일 타임 상수 (compile-time constant) 이다.
valobject / companion object 내부const val MAX_COUNT = 10
Kotlin은 JVM 위에서 동작하므로
결국 Java 바이트코드로 변환된다.
val 사용object Constants {
val NAME = "John"
}
public final class Constants {
@NotNull
private static final String NAME = "John";
@NotNull
public final String getNAME() {
return NAME;
}
public static final Constants INSTANCE;
static {
INSTANCE = new Constants();
}
}
println(Constants.NAME)
→ Java에서는
Constants.INSTANCE.getNAME();
즉,
const val 사용object Constants {
const val NAME = "John"
}
public final class Constants {
public static final String NAME = "John";
}
getter가 없다.
그리고 사용된 코드에서는
System.out.println("John");
→ 값이 직접 인라인이 되다.
const val은 JVM에서 다음과 같이 처리된다.
public static final
그리고 compile-time constant여서
사용하는 쪽 클래스의 constant pool에 값이 복사된다.
즉,
println(Constants.NAME)
은 실제 바이트코드에서
println("John");
이 된다.
반면 val은
const val을 추천하는 이유IntelliJ에서 val보다 const val을 추천한다.
이유는 아래와 같다.
1. 불필요한 getter 제거
2. INSTANCE 접근 제거
3. 바이트코드 단순화
4. 성능에 대한 이점
5. 어노테이션에서 사용 가능