요약
- 비원시값은 (배열, 함수, 객체 등) 작업에 따라 메모리 할당용량이 바뀔 수 있다.
- 원시값은 할당할 메모리 용량이 그렇게 가변적이지 않다.
- 따라서, 비원시값은 가변적인 용량을 처리할 수 있는 메모리에 따로 할당된 후 메모리 주소만 변수에 넘겨준다.
- 원시값은 그냥 변수에 할당해도 큰 관계가 없다.
- 즉 효율성 문제로 원시값과 비원시값의 데이터 저장 방법이 달라지게 된 것이다.
원시값은 숫자, 문자열, 불리언값이고 그 외 값들은 비원시값이라는 말을
많이 많이 들었다.
원시값은 변수에 그 값을 저장하고, 비원시값은 그 값이 있는 메모리 주소를 저장한다는데
조금 더 직선적으로 이해해보자.
원시값은 숫자, 문자열, 불리언값을 말한다.
원시값을 가지고 있는 변수는 오로지 문자열이던, 숫자던, 불리언값이던 자체만을 가지고 있을 수 있다.
변수가 그 값 자체를 전부 가지고 있으므로, 일부분만 수정하는 것이 불가능하다.
무슨소리냐?
// 원시타입은 immutable data types 이다.
// 값이 한번 선언되면 원시 값을 바꿀 수 없다.
let string1 = 'This is a string'
string1[1] = 'X'
console.log(string1) // string1은 This is a string 이다. (바뀐게 없다.)
string1 = 'xyz'
console.log(string1); // string1은 xyz이다. (통째로 바뀌었다.)
위에서 실험해보면 알 수 있듯, 문자열의 중간 인덱스 하나만 바꾸는 것은 불가능하다.
하지만 해당 변수가 할당한 자료를 전부 바꾸는 것은 가능하다.
즉,
원시값은 한번 선언되면 그 값을 중간만 바꾸는게 불가능하며,
이는 값이 변수 자체에 포함이 되어있어서 그런 것이다.
const a = 150 하면
a 주소에 150이라는 자료가 그대로 들어가있다.
반면에
비원시값은 변수가 값이 아닌 그 값이 있는 주소를 참조하는 특성이 있다.
const a = [1, 2, 3]
const b = [1, 2, 3]
const c = a === b // what is c? : false
a와 b는 같을까?
아니다.
false가 나온다.
왜일까?
a가 가진 배열(비원시값)과 b가 가진 배열(비원시값)이 할당된 주소가 다르기 때문이다.
그렇다면 질문이다.
그럼 비원시값은 왜 비원시값 자체가 아닌 비원시값이 할당된 주소를 변수에 할당할까?
비원시값(배열, 객체, 함수 등)은 작업에 따라서 가져야할 메모리 크기가 가변적이다.
즉, 작업에 따라 1개 요소를 가진 배열이 될 수도, 수만가지의 요소를 가진 배열이 될 수도 있다.
시도때도없이 메모리 할당이 바뀌면 프로그램의 실행에 큰 영향을 미친다.
따라서 메모리에서 가변적인 데이터를 처리할 수 있는 부분에 비원시값들을 저장해야한다.
이렇게 하지않고, 비원시값 자체를 변수에 우겨넣는다면
프로그램이 쉽게 터질 수 있기 때문이다.
그래서 변수는 비원시값들이 있는 메모리 주소만 참조를 한다.