[Kotlin] const val과 val의 차이

강승구·2023년 8월 28일

const val

const val은 컴파일 시점에 값을 할당한다. 그렇기 때문에 함수나 클래스의 상태에 상관없이 언제나 동일한 값을 가진다.

const val은 컴파일 시에 데이터가 메모리에 존재하기 때문에, 사용 시 객체를 생성해서 이에 접근하는 것이 아니고, 클래스명.상수명의 형태를 사용해서 직접 접근한다.

클래스의 생성자에 할당될 수 없으며, String을 포함한 기본 자료형으로만 선언이 가능하다. (참조형으로는 선언 불가)
함수 내의 지역변수나 클래스의 속성으로 사용할 수 없기때문에 const val을 함수나 클래스 내에서 사용하려면 companion object 안에 선언해야한다.

또한 const val은 기본 자료형만 사용이 가능하다. 또한 const val의 이름은 일반적인 변수와 달리 '대문자'와 '_'를 사용한다는 컨벤션이 있다.


val

val은 런타임 시점에 값을 할당한다. 그렇기 때문에 프로그램 수행 중에 프로그램 수행에 따라 값이 바뀔 수 있다.

두 숫자를 더한 값을 반환하는 함수를 사용해서 val의 값을 정한다고 했을 때, 이 값은 함수의 parameter로 들어가는 숫자에 따라 언제든지 달라질 수 있다.

fun main() {
    val num = sumExam(40, 20)
    println(num)
}

fun sumExam(a: Int, b: Int) = a + b

컴파일 시점과 런타임 시점 값 할당의 차이

아래 두 예제는 valconst val로 선언한 상수에 접근하는 코틀린 코드를 자바로 디컴파일한 코드이다.

런타임 시점 실행

object Constants {
    val NAME = "kotlin"
}

//Kotlin
fun test(){
    val name = Constants.NAME
}

//Java
public final void test(){
    String name = Constants.INSTANCE.getName()
}

컴파일 시점 실행

object Constants {
    const val NAME = "kotlin"
}

//Kotlin
fun test(){
    val name = Constants.NAME
}

//Java
public final void test(){
    String name = "kotlin"
}

val로 선언한 상수는 값을 참조하지만 const val로 선언한 상수는 컴파일 시점에 이미 값을 알고있기 때문에 값으로 대체가 가능하다.

따라서 const val로 선언한 상수는 값이 inline 되면서 값을 참조할 때마다 상수에 접근하면서 발생하는 오버헤드를 줄일 수 있다는 장점이 있다.
또한 객체를 생성해서 값에 접근하지 않기 때문에 성능을 향상시킬 수 있다는 이점이 있다.

profile
강승구

0개의 댓글