1. 원시 값과 참조 값의 개념
- 원시 값 : 변경 불가능한 작은 데이터 조각.
예) String, Number, Boolean, undefined, null
- 참조 값 : 변경 가능한 객체들
예) {name: 'Alice'}, ['apple', 'banana'], Object, Array, Function
2. 원시 값과 참조 값의 메모리 저장 방식
2-1. 원시 값의 메모리 저장
- 스택 메모리에 저장
- 불변성 : 데이터가 한번 생성이 되면 변경될 수 없는 성질 즉, 데이터가 불변하다면 원본 데이터는 수정이 되지 않고, 변경이 필요한 경우에는 새로운 데이터를 생성
- 자료의 크기와 생명 주기가 정해져 있음
2-1. 참조 값의 메모리 저장
- 힙 메모리에 저장
- 힙 메모리는 구조가 느슨하며, 크기나 생명 주기가 가변적인 데이터를 저장하는데 적합한 메모리 영역
3. 복사 방식의 차이
원시 값 복사
- 완전히 독립적인 복사본을 생성
- 깊은 복사 : 모든 레벨에 대한 프로퍼티를 완전하게 복사하는 것
let a = 10; // 원시 타입 값
let b = a; // 원시 타입 복사: 값 '10'이 복사된다.
console.log(a); // 출력: 10
console.log(b); // 출력: 10
a = 20; // 'a'의 값을 변경한다.
console.log(a); // 출력: 20
console.log(b); // 출력: 10, 'b'는 변경되지 않는다.
참조 값 복사
- 동일한 객체를 가리키는 주소를 공유
- 얕은 복사 : 객체의 상위 레벨의 프로퍼티만 복사. 참조 값(주소)만 복사
let x = { value: 10 }; // 참조 타입
let y = x; // 참조 타입 복사: 메모리 주소가 복사된다.
console.log(x); // 출력: { value: 10 }
console.log(y); // 출력: { value: 10 }
x.value = 20; // 'x'의 프로퍼티 값을 변경한다.
console.log(x); // 출력: { value: 20 }
console.log(y); // 출력: { value: 20 }, 'y'도 영향을 받는다.
4. 메모리 관리
원시 값
- 스택에 저장된 데이터는 함수 호출이 종료되는 등의 상황에서 스코프를 벗어나면 자동으로 메모리가 해제
스택 메모리는 후입선출 방식을 따른다.
ㄴ 함수가 호출이 될 때, 그 함수 내에서 정의된 원시 타입의 지역 변수들은 스택에 할당(푸쉬)
ㄴ 함수가 작업을 수행하는 동안, 이 변수들은 스택에 존재, 함수 내에서만 접근이 가능
ㄴ 함수가 작업을 마치면, 컨텍스트는 스택에서 팝(pop)이 된다. 이때 팝되는 과정에서 함수의 지역변수도 같이 제거가 된다.
ㄴ 이러한 메모리 해제 과정은 자동으로 이루어지며, 개발자가 직접 관리 할 필요가 없다.
- 성능 : 원시 값은 간단하고 효율적으로 빠르게 처리가 가능하다.
참조 값
- 힙 메모리에 할당된 객체들은 프로그램의 복잡한 메모리 관리가 요구 된다. 이를 위해 가비지 컬렉션 기법 사용
- 가비지 컬렉션 : 사용되지 않는 객체를 자동으로 정리하여 메모리 누수 방지
- 성능 : 더 많은 메모리와 관리가 필요
가비지 컬렉션
let z = { name: 'JavaScript' }; // 참조 타입 생성
// 이 시점에서 'z'는 메모리 주소를 가리킨다.
z = null; // 'z'의 참조를 제거합니다.
// 이 시점에서 원래 { name: 'JavaScript' } 참조를 할 수 없으므로, 객체는 도달할 수 없게 된다.
// 가비지 컬렉터는 이를 인지하고 메모리를 정리할 것이다.
// { name: 'JavaScript' }를 정리하게 된다.
'CS > 프로그래밍' 카테고리의 다른 글
Flex 속성(CSS) (0) | 2023.12.01 |
---|---|
TDD (0) | 2023.11.03 |
웹팩과 바벨 (0) | 2023.11.02 |
use strict, undeclared (0) | 2023.11.01 |
탐색 알고리즘 (1) | 2023.10.13 |