코틀린에서 변수를 선언할 때는 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), 대문자와 언더바(_)로만 네이밍을 하는 건 암묵적 룰이다..!
'Kotlin (코틀린)' 카테고리의 다른 글
[Kotlin] 코틀린 함수 / 메서드와 함수 / 단일 표현식 함수 (0) | 2024.05.10 |
---|---|
[Kotlin] 코틀린 늦은 초기화 기법 - lateinit / lazy (0) | 2024.05.08 |
[Kotlin] 코틀린 래퍼 클래스 Wrapper Class (0) | 2024.05.07 |
[Kotlin] 코틀린 자료형 / 타입 캐스팅 / 값 비교 (0) | 2024.05.06 |
[Kotlin] 코틀린 입문 / 코틀린이란? / 코틀린 특징 (0) | 2024.05.04 |