val vs var
Kotlin 면접 질문으로 가장 기초적인 질문이다.
곧 있을 면접에 대비해 Kotlin 질문을 다시 정리하고 있다. gpt가 추천해준 첫 번째 질문으로 var과 val의 차이를 물어봤다. 이를 구글에 검색하니 약 70% 정도의 블로그가 val을 불변이라고 표현하고 있다. 과거의 나 역시 면접 때 그렇게 답변했고, 이는 "정말로 불변인가요?"라는 꼬리 질문으로 이어졌다. 그래도 꼬리 질문에는 잘 답변했다. 저렇게 답한다고 해서 감점이 되지 않겠지만 정확히 알고 있다면 이점은 될 것 같다.

공식 문서에는 위와 같이 표현하고 있다. var를 mutable로 표현했으니 val은 immutable로 표현할 것 같지만 굳이 read-only라고 표현한 데에는 이유가 있다.
Backing property
private var _name
val name get() = _name
(사실 위 코드는 더 간단히 표현할 수 있지만, 편의를 위해...) 먼저, 안드로이드에서 흔히 사용되는 backing property를 살펴보자. 위 코드에서는 커스텀 getter인 get()을 사용하고 있다. 변수 name을 읽을 때마다 값을 평가한다. 따라서 _name이 변경되면 name이 val로 선언되어 있을 지라도 변경된다.
Mutable type
val list = mutableListOf<String>()
위 코드 또한 list를 val로 선언했으나 값이 변한다는 것이 직관적으로 와닿을 것이다. list가 들고 있는 참조 값은 변하지 않지만, List의 내부 값은 변경될 수 있기 때문이다. 비슷한 이유로 Compose에서도 List와 같이 interface 타입을 unstable로 규정하고 있다.