해당 글은 책을 보고 중요하다고 생각한 부분을 그대로 옮기기도 하지만 저만의 언어로 풀어 작성한 글입니다. 틀린 내용이 있을 수 있고, 저만의 언어로 풀다보니 누락되거나 내용이 다르게 전달될 수 있습니다.
일반적으로 기본형은 할당이나 연산시 복제되고 참조형은 참조된다고 알려져 있습니다. 엄밀히 말하면 둘 모두 복제를 합니다. 다만 기본형은 값이 담긴 주솟값을 바로 복제하는 반면 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제합니다.
과거에는 데이터를 최대한 효율적으로 사용해야 했지만 현대에 들어서 메모리가 여유가 생겨 숫자의 경우 64비트, 즉 8바이트를 확보합니다. 덕분에 개발자가 형변환을 걱정해야 할 상황이 덜 발생하게 되었습니다.
변수와 상수를 구분하는 성질은 ‘변경 가능성’입니다. 값을 재할당할 수 있으면 변수, 재할당할 수 없으면 상수입니다. 여기서 변경 가능성의 대상은 변수 영역 메모리입니다. 반면 불변성 여부를 구분할 때의 변경 가능성의 대상은 데이터 영역 메모리입니다.
{
var a = 'abc';
a = a + 'def';
}
// 이 경우 'abc'가 'abcdef'로 바뀐다.(O, X)
정답은 X, abc
는 기본형(원시형) 데이터이므로 불변값입니다. abc
라는 문자열에 def
를 더하여 abcdef
로 값이 바뀌는 것이 아니라 새로운 값으로 abcdef
가 만들어집니다.
var a = 5;
var b = 5;
// 여기서 a와 b는 서로 다른 5를 바라보고 있다.(O, X)
정답은 X, 변수 a
를 선언하고 값인 5
를 할당할 때 데이터 영역에서 5
를 찾고, 데이터가 없기 때문에 데이터 공간을 하나 만들어 5
를 저장합니다. 그리고 5
를 저장한 주소값을 변수 a
에 할당합니다. 그리고 b
를 선언할 시점에 5
를 할당하려고 할 때 다시 데이터 영역에서 5
를 찾습니다. 그리고 이미 만들어져있는 5
의 데이터 주소를 재활용합니다. 그래서 같은 5
를 바라보고 있다고 할 수 있습니다.
const obj = {
a: 1
}
obj.a = 1;
// const 키워드로 선언하였기 때문에 에러가 난다.(O, X)
정답은 X, obj
의 주소값은 여전히 같고 obj.a
의 주소값이 변하였으므로 위의 경우는 타입에러가 나지 않습니다. obj
의 주소값이 변하는 경우 타입에러가 발생합니다.
빈칸에 들어갈 단어는 무엇일까요?
_가 0인 메모리 주소는 가비지 컬렉터의 수거 대상이 됩니다. _는 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수를 말합니다.
정답은 참조 카운트(Reference Count), 자신을 참조하고 있는 메모리의 개수를 말하고 런타임 중간에 참조를 끊어 참조 카운트가 0인 메모리는 가비지 컬렉터가 자동으로 수거합니다.