
🔍 변수와 데이터 타입에 대한 이해는 프로그래밍의 기본적인 부분을 이해하는 데 중요하기 때문에 이러한 개념들은 코드의 작동 방식, 메모리 관리, 그리고 버그의 발생 원인 등을 이해하는 데 큰 도움이 됩니다.
원시 타입은 값에 의한 전달(call by value)이 일어나며, 객체 타입은 참조에 의한 전달(call by reference)이 일어납니다. 이로 인해 얕은 복사와 깊은 복사의 차이가 생기며, 이를 이해하지 못하면 예상치 못한 결과나 버그를 초래할 수 있습니다.변수는 데이터를 저장하고 참조하는 역할을 합니다. 데이터 타입은 변수가 가질 수 있는 데이터의 종류를 결정하며, JavaScript에서는 원시 타입과 객체 타입이 있습니다.
var는 함수 스코프를 가지며, 호이스팅이 발생합니다. let과 const는 블록 스코프를 가지며, 호이스팅이 발생하더라도 Temporal Dead Zone(TDZ) 때문에 변수 선언 전에 접근할 수 없습니다. let은 재할당이 가능하지만, const는 한번 할당하면 변경할 수 없습니다.💡 크게 두가지로 나뉘어집니다.
기본형(Primitive) / 참조형 (Reference)
모든 데이터는 바이트 단위의 식별자, 즉 메모리 주솟값 을 통해 서로 구분하고 연결합니다.
변수 : 변할 수 있는 데이터 (숫자, 문자열, 객체, 배열 등)
식별자 : 어떤 데이터를 식별하는데 사용하는 이름 (== 변수명)
var a; // 변할 수 있는 데이터를 만든다. 이 데이터의 식별자는 a로 한다.
var a; // 변수 a 선언
a = 'abc'; // 변수 에 데이터 할당
var a = 'abc'; // 변수 선언과 할당을 한 문장으로 표현
실제로 해당 ‘a’ 변수 데이터에 문자열 ‘abc’를 직접 저장하지는 않는다. 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보해서 문자열 ‘abc’를 저장하고, 그 주소를 변수 영역에 저장한다.
✨ 아래 그림과 순서를 참고하면 이해가 쉽다.


⬇️

그렇다면, 이후에 같은 변수 a에 'abcdef'를 선언해주면 어떻게 될까?
쉽게 말해서 5004번에 들어있는 문자열 'abc'를 문자열 'abcdef'로 바꿀 수 있을 것 같지만 컴퓨터는 그렇게 하지 않는다.
'abcdef'를 별개의 문자열로 지정하고, 임의의 공간 5005에 문자열 'abcdef'를 넣고, 5005 를 들고 a를 검색한다. 1003번에 있으니 그 공간에 있는 값을 5004 대신에 5005로 바꾸게 된다.

즉, 기본형에서는 변수 값을 바꿀 때 가르키고 있는 주소를 직접 바꾼다 !
✋🏻 참고로 자바스크립트 메모리 구조는 스택 메모리와 힙 메모리 영역으로 나뉘어 있고, 이번 글에서는 둘을 하나로 묶어 메모리라고 하는 것이다.

number, string, boolean, null, undefined, symbol
call by value라고 합니다 let a = 1;
let b = a;
a = 2;
console.log(b); // 1
변수 b는 a의 값 1을 복사하여 할당받았습니다.
이후 a의 값이 2로 변경되었지만, b의 값은 여전히 1입니다.
a의 값 변경이 b에 영향을 미치지 않는 것을 볼 수 있습니다.
이는 기본형 데이터가 값에 의한 전달 방식을 사용하며, 불변성을 갖기 때문입니다.
object(Map, WeakMap, Set, WeakSet), array, function, date, regexp …
call by reference 라고 합니다 let obj1 = { value: 1 };
let obj2 = obj1;
obj1.value = 2;
console.log(obj2.value); // 2
obj2는 obj1이 참조하는 객체를 참조합니다. 따라서 obj1에서 객체의 value 속성을 변경하면, obj2에서도 그 변경이 반영됩니다.
하지만 이것은 참조하는 주소값(객체의 실제 위치)은 불변적이라는 점에 주의해야 합니다. 즉, obj1이나 obj2가 참조하는 주소 자체는 변경되지 않습니다. 이들 변수가 참조하는 객체의 내용은 변경할 수 있지만, 다른 객체를 참조하도록 변경할 수는 없습니다. 이 점은 불변성과 가변성의 개념을 이해하는 데 중요합니다.
📍 출처
코어 자바스크립트 - 데이터타입 (기본형과 참조형)
정재남, [코어자바스크립트]
윤국님 세션