티스토리 뷰
자바스크립트에서 변수는 원시 값과 참조 값이 있습니다.
원시 값에는 string, number, bigint, boolean, undefined, symbol이 있습니다.
참조 값은 위 원시값을 제외한 나머지는 다 참조타입입니다.(배열, 객체, 함수가 대표적)
참조 타입은 변수에는 실제 데이터가 아닌 데이터가 저장된 메모리 위치(주소)를 할당받습니다.
예를 들어, 객체를 a 변수에 할당하고 나서 b 변수에 a를 복사하면, b는 a와 동일한 메모리 위치를 참조하게 됩니다.
따라서, a나 b 중 하나에서 객체 내부의 값을 수정하면,
다른 변수에도 동일한 메모리를 참조하는 관계이므로 수정 내용이 반영됩니다.
이러한 특성은 객체나 배열과 같은 참조 타입의 변수들이 가변적인(mutable) 특성을 가지게 됩니다.
원시 값은?
원시값은 불변한다는 건 알고있었습니다.
누군가가 물어 보았을 때 원시값은 메모리 주소를 바라보는지 아니면 값을 바라보는지 헷갈리기 시작했습니다.
10이라는 숫자가 a변수에 있고 b변수가 a변수를 복사했을때 주소를 복사해오면 참조값이랑 다를게 없는데
값이 불변하다라는 조건만 있기 때문에 변하지 않는건가?
값을 복사하는거라면 자바처럼 자바스크립트에도 스택영역과 힙영역이 나눠져 있지 않을까?
https://www.zhenghao.io/posts/javascript-memory
Zhenghao's site
The official site of Zhenghao He, a software engineer and a TypeScript/JavaScript enthusiast.
www.zhenghao.io
위 블로그를 보고 조금은 해답을 찾은것 같습니다.(블로그 타고타고 가면 끝이 없다)
정리
원시 자료형을 변수에 할당하면 stack이라는 저장 공간에 값 자체가 할당된다.
stack은 고정된 크기의 보관함으로 변수이름과 데이터가 함께 저장된다.
값 자체가 복사된다는 것은 둘 중 하나의 값을 변경해도 다른 하나에는 영향을 미치지 않는다는 것
참조 자료형은 heap이라는 특별한 저장 공간에 저장된 후, 그 저장공간을 참조할 수 있는 주소값을 변수에 저장한다.
따라서 변수에 해당하는 stack에는 주소값이 저장되어 있고, 그 주소값을 통해 참조 자료형에 접근할 수 있다.
이를 참조한다(refer)고 한다.
참조 자료형이 저장된 변수를 다른 변수에 할당할 경우, 두 변수는 같은 주소를 참조하고 있을 뿐 값 자체가 복사 되었다고 볼 수 없다.
v8엔진기준
number type을 할당할 때 실제 값이 아닌 메모리 주소가 할당될 것이다 x
1. 터미널을 열어서 "node --allow-natives-syntax" 라고 입력하면 REPL이 실행됩니다
2. let a = 1; 를 입력하고 엔터
3. %DebugPrint(a) ; 를 입력하고 엔터위와 같이 입력하면 변수 a에 대한 정보가 출력됩니다.
그 결과 DebugPrint: Smi: 0x1 (1)
위와 같이 뜨는데 하나씩 해석해보면
Smi : 데이터 타입입니다. Small Integer의 줄임말입니다.
0x1 : 16진수로 표현된 변수 값입니다
(1) : 10진수로 표현된 변수 값입니다
결론은 a값인 1이 직접 할당되었고 1이 말씀하신 "원시 값 1의 메모리 주소가 저장"되는 일은 없습니다
(메모리 주소를 저장하고 있으면 메모리 주소가 출력됩니다)
다만 문자열일 경우
const a = "hello world"
위의 식에서 원시 값 "hello world"는 constant pool이라는 곳에 저장되는데 이미 "hello world"값이 있다면
해당 메모리 주소를 포인팅합니다
이후 "hello world"를 몇번을 선언하던 관계없이 동일한 메모리 주소를 포인팅하므로
메모리를 절약할 수 있게 됩니다
자세히 들어가면 이렇게 되는데
아직까지 정리가 잘되진않은거같은데
확실한건
큰틀에서
원시값은 값은 할당받고
참조값은 주소값을 참조한다.
이렇게 정리할수 있는거 같습니다.
아 모르겠다..
'개발일지 > 문제 해결' 카테고리의 다른 글
[문제 해결] SyntaxError 엄격모드에 대해서.. (1) | 2024.01.31 |
---|---|
[문제해결] node server.js 실행 시 오류 발생 (0) | 2024.01.25 |
버블 정렬 (1) | 2024.01.08 |
KPT + 서버란? + programmers코딩테스트 입문. (0) | 2023.12.28 |
파이어 베이스 삭제 기능 구현 (1) | 2023.12.22 |