프로그래밍에서의 변수는 임의의 값을 저장한 메모리 주소다.
코틀린은 변수를 사용하기 위해 val과 var키워드를 제공한다.
var: 재 할당할 수 있는 읽고 쓸수 있는 변수 초기화 이후 값을 재할당 할 수 있다. -> (read-write)
val은 값이 한번만 할당되는 변수로 초기화 이후엔 다른 값을 할당할 수 없다. 즉 불변값이다.
val A : Int = 5
A = 6 //6으로 재할당 불가능
초기화 이후에 한번만 사용가능하므로 A의 값을 바꿀 수 없다.
var은 재 할당할 수 있는 읽고 쓸수 있는 변수 초기화 이후 값을 재할당 할 수 있다. 즉 변할 수 있는 값이다.
val A : Int = 5
A = 6 //6으로 재할당 가능
val은 불변이라고 언급했지만, 메모리 주소를 바꿀 수 없다는 뜻이다.
코틀린에서 Collection이나 Array같은 경우 메모리안의 값을 변경할 수 있다.
Collection의 종류인 MutableList을 사용해여 val값의 메모리 주소안 값을 바꾸어보자.
fun main() {
val A: MutableList<Int> = mutableListOf(0,1,2)
A[1] = 0
println(A.toString())
}

val로 A를 선언했지만, A의 첫 번째 인덱스가 바뀌는 것을 볼 수 있다.
메모리 주소는 그대로고, 메모리주소 안의 값만 바뀌는것이다.
var로 선언된 변수를 변경했을 때 어떤일이 벌어질까?
val A : String = "abcd"
A = "efgh"
A를 "efgh"로 변경했을 때 주소를 재할당한다. 즉 "abcd"는 메모리 어딘가에 남아있다.
남아있는 "abcd"는 Grabige Collection을 통해 런타임 중에 일정 시간이 지나면 메모리를 해제 해준다.