val과 var는 모두 변수를 선언하는 데 사용되지만, 원칙적으로 차이가 있습니다:
val number = 42 // number = 10 // 오류!
var counter = 0 counter++ // 허용됨
안전성과 성능:
val을 사용하는 것이 바람직합니다. 이는 우발적인 변경으로부터 보호하고 코드를 이해하기 쉽게 만듭니다.val을 사용하면 컴파일러와 IDE가 컴파일 단계에서 오류를 잡고 코드를 최적화할 수 있습니다.
val로 선언된 객체를 변경할 수 있나요?
답변: 변수 자체의 값(참조)은 재할당할 수 없지만, 객체(예: 리스트)인 경우 내부 상태는 변경할 수 있습니다.
val list = mutableListOf(1,2) list.add(3) // 가능합니다! 하지만 list = 다른리스트는 오류입니다.
이야기
인터넷 쇼핑몰 프로젝트에서 개발자는 제품 리스트를
val items = mutableListOf<Product>()로 정의했으며, 이로 인해 리스트가 완전히 변경 불가능하다고 생각했습니다. 실제로는 다른 부분에서 리스트가 변경되어(새 요소가 추가됨) 장바구니 표시가 예기치 않게 영향을 받았습니다.
이야기
큰 텍스트 파일의 파서에서 array-버퍼를
var buffer로 선언했지만, 파싱 과정에서 변경할 필요가 없었습니다. 우발적으로 새 배열로 다시 할당되었고, 이로 인해 메모리 누수와 데이터 처리 오류가 발생했습니다.
이야기
하나의 마이크로서비스 코드에서 대부분의 변수가 "혹시나" 하는 마음으로
var로 선언되어, 결과적으로 큰 식에서 객체 상태가 서로 다른 스레드에서 변경되어 race condition으로 인한 어려운 버그가 발생했습니다.