Kotlin (코틀린)

[Kotlin] 코틀린 변수 선언 var · val · const val / 변수와 상수

Oscar:) 2024. 5. 5. 22:00

 

 

코틀린에서 변수를 선언할 때는 var, val을 사용한다.

 

 

✅ var

 

Variable의 약자이며 직역하면 '변수'다.

가변(Mutable) 변수로 사용되기에 읽기와 쓰기 모두 가능한 변수다.

 

var name = "Oscar"
println("초기화 1 : $name")

name = "Taron"
println("초기화 2 : $name")
코틀린에서는 세미콜론(;)을 사용하지 않아도 된다..!

 

 

결과)

 

여러번 초기화할 수 있는 흔한 변수라고 생각하면 된다.

 

 

 


 

✅ val

 

Value의 약자이며 직역하면 '값'이다.

불변(Immutable) 변수로 사용되기에 읽기만 가능한 변수다.

 

즉, 한 번 초기화하면 그 이후로는 값을 변경할 수 없다.

 

var에서 사용했던 예제를 그대로 입력해보자.

val name = "Oscar"
println("초기화 1 : $name")

name = "Taron"
println("초기화 2 : $name")

 

결과)

 

[Val cannot be reassigned == Val는 재할당할 수 없다]

코드를 작성할 때부터 에러가 발생하여 사실 컴파일할 수도 없다.

 

 

 


 

 

정리하자면 var은 변수고, val은 상수라고 생각할 수 있다.

 

- 변수 : 변하는 수

- 상수 : 불변하는, 일정한 수

 

 

하지만 코틀린에서 상수는 const val을 사용한다.

 

..??

 

 

그럼 val은 상수는 또 아니고 불변하는 변수가 되는건가..?

사실 여기서부터 정의가 꼬이는 부분이다.

 

애초에 변수(變數)는 변하는 수인데, 불변한다는 것부터 앞뒤가 안 맞는 것이다.

 

 


 

✅ 그렇다면 val, const val은 뭐가 다를까?

 

간단한 예제로 확인해본다.

 

● val

val a = 1
val b = 2
val c = a + b

 

val은 런타임 시 값이 결정되기 때문에

위와 같이 c를 초기화할 때 어떠한 연산이 이루어질 수 있다.

 

 

 

● const val

 

const val의 경우 일반적인 메서드나 클래스 내에서는 사용할 수 없고,
Object나 companion object 안에서만 사용할 수 있다.

Object에 대해서는 별도로 포스팅할 예정이니, 일단 넘어간다.

 

 

위 val 예제의 c 초기화 부분을 const val로 바꿔보면

companion object {
	val a = 1
	val b = 2
	const val = a + b
}

 

결과)

 

바로 에러를 내뿜는 것을 확인할 수 있다.

 

const val은 컴파일 시점에 값이 결정되기 때문에,

프로그램 흐름 내의 어떠한 영향도 받지 못한다.

 

 

 

● val ==  불완전한 불변성

런타임 시 값이 초기화되기에, 프로그램 수행에 따라 다른 값이 초기화될 수 있다.

 

 

const val ==  진짜 불변성

컴파일 시점에 값이 초기화되기에, 프로그램 수행에 영향을 받지 않는 고정 값이 초기화된다.

 

즉, 런타임 시 생성되는 다른 클래스 객체는 const val로 초기화할 수 없는 구조이며,

String을 포함한 기본 자료형만 사용할 수 있다.

 

 

 

 


 

 

 

 

✅ 정리

 

var : 언제든지 변할 수 있는 그냥 변수

val : 초기화 이후 값이 변하진 않지만, 어떤 값이 초기화될 지는 알 수 없는 변수

const val : 초기화 전부터 값을 예측할 수 있고, 이후로도 변하지 않는 진짜 상수

 

+상수의 경우(const val), 대문자와 언더바(_)로만 네이밍을 하는 건 암묵적 룰이다..!