CS/프로그래밍

원시 값과 참조 값

오류확인자 2023. 11. 3. 14:29

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