밤빵's 개발일지
[TIL]20241004 var과 val 의 차이? 본문
▶var과 val의 차이
var과 val은 코틀린에서 변수를 선언할 때 사용하는 두 가지 키워드이다. 이들은 모두 변수를 선언하는 데 사용되지만, 값의 변경 가능 여부에 따라 다르게 동작한다.
→ var:
변수에 저장된 값을 변경할 수 있는 가변(mutable) 변수이다.
→ val:
변수에 저장된 값을 변경할 수 없는 불변(immutable) 변수이다.
자바에서는 변수를 선언할 때 기본적으로 값을 변경할 수 있지만, final 키워드를 사용하여 변수의 값을 한 번만 할당하고 변경하지 못하게 할 수 있다. 코틀린에서는 이 개념을 좀 더 명확하게 구분하기 위해 var과 val을 제공한다. 자바와 비교하자면, 'var'는 일반 변수, 'val'은 final 키워드가 적용된 변수라고 볼 수 있다.
▶var
var 키워드를 사용하면 변수를 선언하고 나중에 그 값을 변경할 수 있다. 변수가 가변적이고, 필요에 따라 값을 재할당할 수 있다.
fun main() {
var name = "John" // 문자열 "John"을 할당해준다.
println(name) // 출력: John
name = "Doe" // 값 변경
println(name) // 출력: Doe
}
→ var로 선언된 name 변수는 처음에 "John"이라는 값을 가지고 있지만, 이후 "Doe"로 값을 변경할 수 있다. 자바의 일반적인 변수와 동일한 동작이다.
▶val
val 키워드는 불변 변수를 선언할 때 사용된다. 한 번 값이 할당되면 더 이상 값을 변경할 수 없다. 자바에서의 final과 유사하게, val로 선언된 변수는 값을 재할당할 수 없다.
fun main() {
val age = 25 // 정수 25를 할당
println(age) // 출력: 25
// age = 30 // 컴파일 에러: val 변수는 값을 변경할 수 없다.
}
→ val로 선언된 age 변수는 25라는 값을 가지고 있고, 이후 값을 변경하려고 하면 컴파일 에러가 발생한다.자바에서 final 변수를 선언한 것과 동일한 동작을 보인다.
▶var과 val 사용에 대한 권장 사항
코틀린은 가능한 한 불변(immutable) 변수를 사용하는 것을 권장한다. 변경할 필요가 없는 값은 항상 val로 선언하는 것이 좋다. 이렇게 하면 코드의 가독성이 향상되고, 의도치 않은 값 변경을 방지할 수 있기 때문이다. 불변성은 코드에서 많은 이점을 제공하고, 특히 동시성 문제를 줄이는 데 도움이 된다.
예를 들어, 변수를 선언할 때, 값이 변경되지 않을 경우 val을 사용하여 불변으로 선언한다.
값을 변경해야 하는 경우에만 var을 사용하여 가변 변수로 선언한다.
▶val이 불변이지만, 객체는 불변이 아니다
val로 선언된 변수가 항상 완전히 불변은 아니다. 참조가 불변일 뿐이지, 객체 자체는 불변일 필요는 없다는 것을 의미한다. val로 선언된 객체의 속성은 변경할 수 있다.
fun main() {
val person = Person("John", 25)
person.age = 30 // 객체의 속성 변경은 가능!
println(person.age) // 출력: 30
}
→ val로 선언된 person은 참조는 변경할 수 없지만, Person 객체의 age 속성은 변경할 수 있다. 코틀린에서 참조와 객체의 불변성을 구분하는 중요한 부분!
▶var과 val을 적절히 사용하기
→ 불변 데이터:
값이 변하지 않을 경우 val을 사용해 불변으로 선언한다. 불변 변수를 사용하면 코드가 더 예측 가능해지고, 의도치 않은 값 변경으로 인한 오류를 방지할 수 있다.
→ 가변 데이터:
값이 변할 가능성이 있을 경우에만 var을 사용해 가변으로 선언한다. 하지만 var을 남용하면 코드가 예측하기 어려워질 수 있으므로, 최소한으로 사용하는 것이 좋다.
var은 가변 변수를, val은 불변 변수를 의미하며, 자바의 일반 변수와 final 변수에 각각 대응된다. 코틀린은 가능한 한 불변 변수를 사용하도록 권장하여 코드의 안정성을 높이고, 오류를 줄일 수 있다.
'Kotlin' 카테고리의 다른 글
[TIL]20241007 Safe Call(?.), Elvis 연산자(?:), Not-null Assertion(!!) 활용 (0) | 2024.10.07 |
---|---|
[TIL]20241006 Nullable과 Non-Nullable 타입: 코틀린의 null 안전성 (0) | 2024.10.06 |
[TIL]20241005 자바와 코틀린의 변수 선언 방식 차이 (1) | 2024.10.05 |
[TIL]20241002 Coroutines② (0) | 2024.10.02 |
[TIL]20241001 Coroutines (0) | 2024.10.01 |