프로그래밍안드로이드 개발자 / 백엔드 개발자

Kotlin에서 const val과 컴파일 타임 상수의 초기화는 어떻게 작동합니까? 일반 val과의 차이점, 제한 사항은 무엇이며, 주석에서 어떻게 사용되며, 원하는 곳에서 항상 const val을 사용할 수 없는 이유는 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변

Kotlin에서 const val 키워드는 컴파일 타임 상수를 선언하는 데 사용되며, 즉 컴파일 단계에서 알려지고 계산되는 값입니다.

  • const valtop-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만 가능합니다.

타입 제한에 대한 무지는 컴파일 오류와 시간 낭비로 이어졌습니다.