Primitive (원시의) 값과 Reference (참조) 값의 차이점
JS에는 7가지의 자료형이 있다.
나는 이것을 스불ㄴ,,너어우스!! (쓰불넘쓰)라고 부른다..
변수 타입의 앞글자에 내 마음대로 음절을 만든 것인데 이렇게 만든 이유는 그냥 외우기 쉬워서 그랬다..
스(S:string) - 문자열
불(B:boolean) - 불리언
ㄴ(N:number) - 숫자
너(N:null) - null
어(U:undefined) - undefined
우(O:object) - object
쓰(S:symbol) - symbol
여기서 Primitive 값(원시 값)은 object를 제외한 나머지 타입들을 말한다.
따라서 Reference 값(참조 값)은 object이다.
원시 값은 실제 자료를 가리키며,
참조 값은 자료의 위치를 가리킨다.
이러한 특징으로, 다음과 같은 결과가 나타날 수 있다.
//원시 값
let a = 10;
const b = a;
a = 20;
console.log(a);
//출력 결과
10
b는 a의 값이 바뀌기 이전에 할당되었으므로, 20이 아닌 10을 출력한다.
//참조 값 예시1
let a = {
age: 20,
};
const b = a;
a.age = 10;
console.log(b);
//출력 결과
Object { age: 10 }
b는 a의 위치를 가리키므로,
a의 자료가 변화하였을 때 변화된 값이 출력된다.
let a = {
name: "ha",
};
const b = a;
a = {
name: "kim",
}
console.log(b);
//출력 결과
Object { name: "ha" }
b에 a.name = "ha"일 때의 위치를 할당하였고,
a는 새로운 위치를 할당받았으므로 a.name ="kim"이다.
garbage collector
C언어와 같은 저수준(컴파일러나 인터프리터 없이 기계어 코드로 변환할 수 있는 수준, 실행이 아주 빠른 특징이 있다.)의 언어는 메모리 관리를 위해 malloc()과 free()를 사용한다.
반면에 JS는 객체가 생성되었을 때 자동으로 메모리를 할당하고 쓸모 없어졌을 때 자동으로 해제한다(garbage collection).
이는 개발자가 메모리 관리에 대해 고민할 필요가 없다는 잘못된 인상을 줄 수 있기에 잠재적 혼란의 원인이 되기도 한다.
garbage collector의 목적은 메모리 할당을 추적하고 할당된 메모리 블록이 더 이상 필요하지 않게 되었는지를 판단하여 회수하는 것이다. 하지만 어떤 메모리가 여전히 필요한지 아닌지를 판단하는 것은 비결정적 문제이기에 궁극적인 방법은 아닐 수 있다.
가비지 콜렉터는 이 문제에 대한 제한적인 해결책을 구현한다.
대표적인 가비지 컬렉션 알고리즘인 참조-세기(Reference-counting)는 가장 소박한 알고리즘이라고 한다.
더 이상 필요하지 않은 오브젝트 -> 어떤 다른 오브젝트도 참조하지 않는 오브젝트
로 정의한다.
다음은 MDN에서 가져온 예시이다.
var x = {
a: {
b: 2
}
};
// 2개의 오브젝트가 생성되었다. 하나의 오브젝트는 다른 오브젝트의 속성으로 참조된다.
// 나머지 하나는 'x' 변수에 할당되었다.
// 명백하게 가비지 콜렉션 수행될 메모리는 하나도 없다.
var y = x; // 'y' 변수는 위의 오브젝트를 참조하는 두 번째 변수이다.
x = 1; // 이제 'y' 변수가 위의 오브젝트를 참조하는 유일한 변수가 되었다.
var z = y.a; // 위의 오브젝트의 'a' 속성을 참조했다.
// 이제 'y.a'는 두 개의 참조를 가진다.
// 'y'가 속성으로 참조하고 'z'라는 변수가 참조한다.
y = "mozilla"; // 이제 맨 처음 'y' 변수가 참조했던 오브젝트를 참조하는 오브젝트는 없다.
// (역자: 참조하는 유일한 변수였던 y에 다른 값을 대입했다)
// 이제 오브젝트에 가비지 콜렉션이 수행될 수 있을까?
// 아니다. 오브젝트의 'a' 속성이 여전히 'z' 변수에 의해 참조되므로
// 메모리를 해제할 수 없다.
z = null; // 'z' 변수에 다른 값을 할당했다.
// 이제 맨 처음 'x' 변수가 참조했던 오브젝트를 참조하는
// 다른 변수는 없으므로 가비지 콜렉션이 수행된다.
출처
https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management#memory_life_cycle
자바스크립트의 메모리관리 - JavaScript | MDN
C 언어같은 저수준 언어에서는 메모리 관리를 위해 malloc() 과 free()를 사용한다. 반면, 자바스크립트는 객체가 생성되었을 때 자동으로 메모리를 할당하고 쓸모 없어졌을 때 자동으로 해제한
developer.mozilla.org
'IT > JS' 카테고리의 다른 글
클로저(closure) (0) | 2021.08.11 |
---|---|
고차 함수 그리고 중첩 함수 (0) | 2021.08.10 |
npm install에 대하여 (0) | 2021.08.09 |
Hoisting에 대한 정리 (0) | 2021.07.31 |
JS에서의 this란 무엇일까? (0) | 2021.07.26 |