- 원시타입 : 원본 값을 저장.(재할당 시 원본 값만 복사) 원본 변경되지 않음
- 참조타입 : 값을 저장하는 대신 데이터가 담긴 저장소의 주소를 저장.(재할당 시 메모리 주소 복사.) 같은 주소의 메모리 내의 원본 값이 변경됨.
* 원시타입의 데이터(primitive data types; 원시 자료형)
: 객체가 아니면서 method를 가지지 않는 6 가지의 타입
: string, number, bigint, boolean, undefined, symbol, (null)
: 원시 자료형은 모두 "하나"의 정보, 즉, 데이터를 담고 있음. 예전에는 데이터 저장소(메모리)의 용량이 제한되어 변수 하나에 데이터 용량이 제한된 하나의 원시 자료형 밖에 담을 수밖에 없었음.
: 변수에는 데이터의 크기와는 관계없이 하나의 데이터만 담을 수 있음 (stack
)
: 원시 자료형은 값 자체에 대한 변경이 불가능(immutable)하지만, 변수에 다른 데이터를 할당할 수는 있음
* 참조 자료형(reference data type; 참조 타입)
: 원시 자료형이 아닌 모든 것. 배열([])과 객체({}), 함수(function(){})
가 대표적
: 참조 자료형에는 하나의 데이터가 아닌 여러 데이터가 담기게 된다
: 참조 자료형의 데이터 자체는 heap
storage 에 저장되고, 변수에는 이 메모리상 주소가 저장됨. heap 에서는 동적(dynamic)으로 사이즈 변경이 가능함(배열과 객체의 값 추가, 삭제 등).
: 이처럼 데이터는 별도로 관리되고, 우리가 직접 다루는 변수에는 주소가 저장되기 때문에 reference data type이라고 불림
: 레퍼런스(reference) : 변수가 가리키고(refer) 있는 데이터를 참조. 그 변수의 주소를 "참조"하여 실제 변수가 있는 장소에 어떤 데이터가 있는지 도착하고 나서야 비로소 "읽을 수" 있기 때문.
+) 원시자료형은 "값 자체"를 복사해서 전달하고(변경 시 원본 값에 변동 없음),
참조자료형은 값이 들어있는 "주소"만 복사해서 전달함(같은 주소에 있는 값을 가리킴, 변경시 원본 값에 변동 있음)!!
새로운 변수에 원시 자료형을 할당하는 경우, 그 값 자체를 변수에 할당함.(값을 복사해서 변수에 저장) 그래서 변수를 변경해도 원본 원시 자료형의 값이 변하지 않음.
새로운 변수에 참조 자료형을 할당하는 경우, 값이 들어있는 주소를 변수에 할당함. 같은 주소를 가지고 있는 변수가 되므로, 새로운 변수를 변경할 경우 같은 주소 안의 원본 값도 같이 변경됨.
왜 참조자료형끼리 비교하면 같지 않다고 나오지?? 내용은 같아도 주소값이 다른가?
=> 맞음. 참조 자료형의 ===(strict equality)는 주소값이 같은지를 확인함. 두 참조 자료형의 주소값은 다르다!!
x 는 객체의 변수니까 데이터저장소(heap)의 주소가 저장되어있음. y 에는 이 주소값이 할당되었음. y 의 값을 변경하면 이 주소 안의 데이터 원본 값이 변경됨.
=> y 에 다른 값이 재할당되어서 y 는 더이상 주소를 가리키지 않게 되었고, x 값에는 변동이 없는 거였음!!
ourArray = myArray 로 ourArray 의 주소값과 myArray의 주소값은 같아짐.
ourArray[2] = 25; myArray의 2번 인덱스 값은 이미 변경이 됨.
ourArray 에서 가리키는 주소는 myarray의 주소인데, 여기에 undefined 를 할당함.
그러면 myArray 는 undefined 가 되지 않나? 왜 myArray 값은 변경되기만 하고 남아있지?
=> 4번과 마찬가지로 ourArray 에는 주소값이 아닌 undefined 가 새로 할당되었기 때문에, 더이상 myArray 의 주소를 가리키고 있지 않아서 myArray 에 접근할 수 없음.
변수에 참조자료형을 할당하여 함수를 실행할 경우, 함수에 의해서 참조자료형이 변경되면 같은 주소에 있는 원본 참조자료형의 값도 변경됨.
변수에 원시자료형을 할당하여 함수를 실행한 경우, 주소가 아닌 값 체만 복사하여 전달하므로 함수 내용과 상관없이 원시자료형의 원본 값은 변경되지 않음.
+) 참고자료 (한글로 검색하면 블로그 내용이 너무 많이 나와서 영문 검색 후 읽는 쪽을 선호하고 있다. 시간이 없거나 잘 이해가 되지 않는 부분은 도움! 구글 번역!)
A Guide to Heaps, Stacks, References and Values in Javascript
=> 그동안 들어보기만 했었던 스택과 힙에 관해 간단하게 정리한 아티클. 스택과 힙이 원시자료형과 참조자료형을 할당하는 공간이었구나!
When something is stored in the stack, it is stored by value. When something is stored in the heap, it is stored by reference.
Primitive vs Reference Data Types in JavaScript
=> 원시, 참조자료형, 스택, 힙을 간단하게 정리한 다른 아티클. 스택에는 원시자료형만 저장되는 것이 아니라, 힙에 저장된 주소를 가리키는 참조자료형의 변수명(포인터)도 저장됨.