var vs val
두 키워드 모두 Kotlin에서 변수 선언 시 사용되는 키워드입니다.
둘의 차이는 초기화한 후 값에 대한 변경이 가능하냐 불가능하냐입니다.
var : 변경 가능한 mutable 참조를 저장하는 변수입니다.
- val 키워드 변수의 값은 재할당(변경)이 가능합니다.
- 자바의 일반 변수에 해당됩니다.
var number = 1
number = 2
println(number)
// output: 2
val : 변경 불가능한 immutable 참조를 저장하는 변수입니다.
- val 로 선언된 변수는 초기값을 변경하는 것이 불가능합니다.
- 자바의 final 변수에 해당됩니다.
val number = 5
number = 3 // Compile Error
코드를 작성할 때 기본적으로 val 키워드의 불변 변수를 사용하고, 변경이 필요한 변수에 대해서만 var 키워드로 변경하는 것을 권장합니다.
var, val 키워드 모두 코드 블럭 내에서 컴파일러가 초기화 문장이 실행되는 것을 확인한다면 선언과 초기화를 동시에 수행하지 않아도 됩니다.
fun foo() {
val message: String
if (true) {
message = "Success"
} else {
message = "Failed"
}
}
const val vs val
val과 const val 변수 모두 값이 한 번 할당되면 이후에 변경할 수 없는 불변 함수입니다.
둘의 주된 차이는 값이 할당되는 시점입니다.
const val 변수는 컴파일 시간 상수로 컴파일러가 이미 알고 있는 값을 할당합니다.
- 이 값은 컴파일 시간에 이미 확정되며 런타임시에 값을 변경할 수 없습니다.
- 주로 상수와 같이 변경되면 안 되는 값들을 선언하는데 사용합니다.
- 클래스 내부나 함수 내부에서 선언할 수 없으며, 최상위 수준 또는 객체 싱글톤 내부에서만 사용가능합니다.
- 변수의 이름을 대문자와 언더바로 구성하는 암묵적인 규칙이 있습니다.
EX. 잘못된 선언 위치
class Person {
const val REGISTRATION_NUMBER = "000000-0000000" // Compile Error
}
EX. 최상위 프로퍼티 선언
const val REGISTRATION_NUMBER = "000000-0000000"
class Person {
val name = "min"
fun getPersonInformation(): String {
return "name: ${name}, registration number: ${REGISTRATION_NUMBER}"
}
}
val person = Person()
println(person.getPersonInformation())
// output : name: min, registration number: 000000-0000000
EX. 동반 객체 companion object 내 선언
class Person {
val name = "min"
companion object {
const val REGISTRATION_NUMBER = "000000-0000000"
}
}
println(Person.REGISTRATION_NUMBER)
//output : 000000-0000000
상수
상수란 프로그램에서 변하지 않는 값을 의미합니다.
- 상수는 1km = 1000m, pi = 3.14, korea=”대한민국” 등 고유한 값으로 이용할 수 있습니다.
- 상수의 이름을 통해 값의 의미를 쉽게 이해할 수 있으며 이는 코드를 읽거나 유지보수할 때 가독성을 향상합니다.
- 상수를 이용하면 변경 사항이 일어나는 코드에 대해서 일괄적인 변경이 용이해집니다.
- val 과 const val 변수 모두 상수로써 이용할 수 있으며 차이점은 클래스의 내외부 사용 가능여부입니다.
즉, 상수화를 하는 이유는 코드의 가독성, 유지보수성, 안정성 등을 향상하는데 도움을 줄 수 있습니다.
728x90
'Kotlin' 카테고리의 다른 글
Coroutine (0) | 2024.02.13 |
---|---|
수신 객체 지정 람다, with 와 apply (0) | 2023.09.08 |
자바 함수형 인터페이스 활용 (0) | 2023.09.07 |
지연 계산 Lazy 컬렉션 연산 (0) | 2023.09.06 |
컬렉션 함수형 API (0) | 2023.09.05 |