JavaScript Primitive Type VS Reference Type { 원시타입 vs 참조타입 }

조성민·2022년 8월 8일
0

JavaScript

목록 보기
9/9

- Primitive Type ( 원시 타입 )

원시 타입은 7종류가 있습니다.

  • string
  • number
  • bigint
  • boolean
  • null
  • undefined
  • symbol => ES6부터 추가

원시 타입은 변수에 할당될 때 메모리에 고정 크기로 원시 값(불변성 : immutable)을 저장하고 그 값을 변수가 직접 가리키는 형식입니다. 다시 말하면 데이터를 저장하기 위한 별도의 데이터 공간을 확보해 값을 저장하고, 그 공간을 변수 영역에 저장합니다. ( 변수 영역과 데이터 영역이 존재 )


// 예시임
let str = "문자열" // 주소값 100번지에 "문자열" 값이 저장되고 str 변수가 주소값을 가리킴
str = "새문자열" // 주소값 200번지에 "새문자열" 값이 저장되고 str 변수가 주소값을 가리킴
// 주소값 100번지에는 "문자열" 값이 그대로 존재.

변수에 값을 재할당할 때 기존 값이 변하는 것처럼 보이지만 사실은 새로운 메모리에 재할당한 값이 저장되고 변수가 가리키는 메모리가 달라지는 것이다.


// 예시임
let str = "Hello";
let string = str;

str = "world!";

console.log(str); // world!
console.log(string); // Hello

원본 변수에 값을 재할당해도 복사본의 값은 변하지 않는다. 새로운 변수 string이 str의 주소값을 가리키기 때문이다.



- Reference Type ( 참조 타입 )

원시타입을 제외한 나머지 배열, 객체, 함수가 참조타입 입니다. 얘네는 별도의 메모리 공간(Heap)에 저장되며 변수의 크기가 동적으로 변할 수 있다. 변수에 할당 시 데이터에 대한 주소 ( 힙(Heap) 메모리의 주소값)가 저장되기 때문에 자바스크립트 엔진이 변수가 가지고 있는 메모리 주소를 이용해서 변수의 값에 접근하게 되는것이다.


let arr = [1, 2, 3];
let newArr = arr;

arr.push(5);

console.log(newArr); // [1, 2, 3, 5]

위 예제에서 newArr에는 arr의 주소값이 들어간다. 그러므로 arr의 값이 변하면 newArr는 같은 곳을 바라보고 있기 때문에 arr의 값과 똑같이 나온다.

profile
풀리면 재밌는 알고리즘

0개의 댓글