Kotlin에서 const val 키워드는 컴파일 타임 상수를 선언하는 데 사용되며, 즉 컴파일 단계에서 알려지고 계산되는 값입니다.
const val은 top-level 변수 또는 object 객체나 companion object로 선언된 속성에만 사용할 수 있습니다.String, 숫자 기본형 또는 Boolean 유형이어야 합니다.val은 수정 불가능한 변수지만 값은 실행 시간에 설정될 수 있으며, 이는 초기화 시 계산이나 함수 호출을 허용합니다:
val timestamp = System.currentTimeMillis() // 이건 const val이 아닙니다 const val APP_NAME = "MyApp" // 이건 컴파일 타임 상수입니다
주석에서는 오직 const val만 사용할 수 있으며, 예를 들면:
const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example
이 경우에 val을 사용하려고 하면 컴파일 오류가 발생합니다.
일반 클래스 내에서
const val을 선언할 수 없는 이유는 무엇입니까?
답변: const val은 변수가 컴파일 타임에 접근 가능해야 하기 때문에, 클래스 인스턴스 변수는 객체가 생성될 때만 초기화되므로 컴파일 타임 상수가 될 수 없습니다.
class Example { // 오류! 이렇게 할 수 없습니다 // const val CLASS_NAME = "MyClass" }
이야기
개발자가 주석을 통해 실행 시간에 계산된 값을 전달하려고 했기 때문에 빌드가 실패했습니다.
개발자가 선언했습니다:
val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App
프로젝트는 컴파일되지 않았습니다. 주석 인수에는 오직 const val만 사용할 수 있습니다!
이야기
Android에서: Intent 내에서 로컬 변수를 상수 키로 사용하려고 할 때 발생한 오류.
class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)
일부 도구나 프레임워크에서는 const val을 예상하며, 일반 val은 사용할 수 없습니다. 그렇지 않으면 IDE나 Android 리소스가 이러한 값을 컴파일 타임 상수로 인식하지 못합니다.
이야기
const val에 부적절한 타입을 사용했을 때의 오류.
const val LIST = listOf(1,2,3) // 오류! 오직 기본형과 String만 가능합니다.
타입 제한에 대한 무지는 컴파일 오류와 시간 낭비로 이어졌습니다.