프로그래밍 언어/코틀린

코틀린 17. const와 상수

닉네임못짓는사람 2020. 12. 26. 20:46
반응형

이번 글에서는 const라는 것에 대해서 알아보도록 하겠습니다.


이 카테고리 초기에 변수에 대해서 알아봤을 때, 저희는 변수를 선언하는 방법을 두 가지 알아봤습니다.

언제든 값을 바꿀 수 있는 var과 초기화하면 값을 바꿀 수 없는 val인데요.

 

이에 이어서 '상수'를 선언하기 위한 const val이라는 키워드가 존재합니다.

'상수'란 한 번 초기화하면 내부의 값을 사용할 수는 있지만, 바꿀 수는 없는 것을 말합니다.

val이 이에 속한다고 할 수 있는데, 그렇다면 const val과는 뭐가 다른 걸까요?

 

그것은 '불변성'에 관련한 차이점에 있다고 할 수 있습니다.

먼저, val의 경우를 생각해보도록 합시다.

val은 값이 '런타임'시에 결정되는 상수인데, 이는 독립적인 동일한 프로그램 수행 중에

프로그램 수행에 따라 값이 바뀔 수 있음을 의미합니다.

 

예를 들어 두 숫자를 더한 값을 반환하는 함수를 사용해서 val상수의 값을 정한다고 했을 때,

이 값은 함수의 parameter로 들어가는 숫자에 따라 언제든지 달라질 수 있습니다.

때문에 val을 사용한 상수는 '불완전한 불변성'을 가지고 있는 것입니다.

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

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

위와 같은 경우 sumExam함수의 parameter로 들어오는 수에 따라 결괏값은 언제든 바뀌게 됩니다.

 

그렇다면, const val의 경우는 어떨까요?

const val은 값이 '컴파일'시에 결정되는 상수로서, val과는 다른 '불변성'을 가지고 있습니다.

또한 const val은 클래스의 생성자에 할당될 수 없으며, String을 포함한 기본 자료형으로만 선언이 가능하며,

런타임 시 생성되는 다른 클래스의 객체는 const val로 선언할 수 없습니다.

 

이런 const val은 함수 내의 지역변수나, 클래스의 속성으로 사용할 수 없는데요.

때문에 const val을 함수나 클래스 내에서 사용하려면 companion object이하 중괄호 안에 선언해주셔야 합니다.

 

이렇게 선언된 const val은 함수나 클래스의 상태에 상관없이 언제나 동일한 값을 가지고 있습니다.

때문에 특정한 고정된 값을 사용하고 싶을 때, 이런 const val을 사용하시면 됩니다.

자바를 배우신 분들은 자바의 static final같은 개념이라고 이해하시면 될 것 같습니다.

 

또한 const val의 이름을 결정할 때에는 일반적인 변수와 달리 '대문자'와 _를 사용해서 결정합니다.

fun main() {
    println(ExamClass.CONST_VAL)
}

class ExamClass(){
    companion object{
        const val CONST_VAL = 100
    }
}

이런 const val의 경우 컴파일 시에 데이터가 메모리에 존재하기 때문에, 사용 시 객체를 생성해서

이에 접근하는 것이 아니고, 클래스명.상수명의 형태를 사용해서 직접 접근합니다.

 

const val상수는 클래스 내에서 상수 사용은 클래스의 객체를 생성한 뒤 사용해야 하는

클래스 속성의 소요시간을 줄임으로 성능의 향상할 수 있게 됩니다.

 

이렇게 이번 글에서는 변수와 상수, val과 const val의 차이에 대해 알아봤습니다.

이번 글은 이 정도로 마치도록 하겠습니다.

감사합니다.

반응형

'프로그래밍 언어 > 코틀린' 카테고리의 다른 글

코틀린 19. 접근제한자  (0) 2020.12.28
코틀린 18. 프로젝트 구조  (0) 2020.12.27
코틀린 16. 추상화  (0) 2020.12.26
코틀린 15. 오버라이딩과 오버로딩  (0) 2020.12.26
코트린 14. 상속  (0) 2020.12.25