🚩 변수의 타입


자바스크립트(Js)에는 타입이라는 개념이 있습니다.

변수에 다양한 타입을 설정 할 수 있습니다. 예를 들어 Java에 int, long, float, byte 등이 타입에 종류라고 생각하시면 됩니다.

int 타입을 사용하는 변수는 숫자를 담을 것이고, char 타입은 문자를 담을 것입니다.

따라서 타입에 따라 할 수 있는 일이 다릅니다.


🚩 메모리 영역


primitive type (원시 타입)과 reference type (참조 타입)을 알아보기 전에 메모리 영역이 어떻게 사용이 되는지에 대해 확실히 알고 가는게 도움이 더 될 것 이라고 판단하여 설명드리겠습니다.

프로그램을 실행하기 위해서는 메모리에 먼저 로드(load) 되어야 합니다. 또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요로 합니다.
따라서 운영체제(OS)는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.

💼 메모리 영역 💼

1. code 영역

2. data 영역

3. stack 영역

4. heap 영역 

1️⃣ code 영역

💼 code 영역 💼

- 실행 할 프로그램의 코드가 저장되는 영역

- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함

2️⃣ data 영역

💼 data 영역 💼

- 프로그램 전역 변수와 정적(static) 변수가 저장되는 영역

- 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸

3️⃣ stack 영역

원시 타입 변수들은 스택 영역에 저장이 됩니다!

💼 stack 영역 💼

- 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역

- 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸 (중요)

- 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임 (stack frame)이라고 함

4️⃣ heap 영역

참조 타입 변수 들은 힙 영역에 저장이 됩니다!

💼 heap 영역 💼

- 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역

- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨

- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당

원시 자료형 (primitive type)


고정된 저장 공간을 차지하는 데이터를 원시 타입이라고 합니다.

💼 종류 💼

- string, number, bigint, boolean, undefined, symbol, (null)


변수에는 데이터의 크기와는 관계 없이 하나의 데이터만 담깁니다.

const num = 123;
const num1 = 1234567;

원시 자료형은 값 자체에 대한 변경이 불가능하지만, 변수에 다른 데이터를 할당이 가능합니다.

let word = "hello word";
word = "hello"; // 변경 가능

const num = 123;
num = 1234 // error (const 사용하여 [상수 개념] 변경 불가능)

원시타입을 변수로 선언하게 되면 메모리 공간에 변수명이 붙고 그 안에 할당한 값들이 들어갑니다. 재 할당시 재할당된 값만이 메모리에 삽입이 됩니다.


참고 타입 (reference type)


Heap 영역에 데이터는 별도로 관리되고, 직접 다루는 변수에는 주소가 저장되기 때문에 참조 타입이라고 합니다.

💼 종류 💼

- array, 객체 등

🔎 참조 타입이 Heap 영역에 사용하는 이유

원시타입 경우 스택 영역에 저장되는데 메모리에서 하나의 데이터만 들어 갈 수 있습니다.
그런데 만약 배열이나 객체 처럼 여러 가지의 값을 삽입한다면 스택영역 저장을 하더라도 하나의 데이터만 들어가기 때문에
찾을 때 문제가 발생합니다.

따라서 heap 영역을 크게 만들어주고 stack영역에 heap영역의 주소값을 넣어 heap 주소에 값을 줄줄이 연결합니다. 그럼 값을 찾을 때 주소를 보고 맞는 heap영역에서 찾아 반환합니다.

heap 영역의 메모리 공간은 동적으로 크기가 변하기 때문에 대량 데이터가 들어오는 경우 고정 데이터 공간을 사용하는 것이 비효율적이고 이러한 이유 때문에 상황에 맞게 크기가 변합니다.

let array = [1, 2, 3];
let parson = {
  nm: 'hyungMinKim',
  age: '28',
  hobby: 'game'
};

🔎 참조 타입 복사 방법

 let array = [1, 2, 3];
 const array1 = array.slice();
 const array2 = [array];

복사 방법은 slice() 사용 또는 [복사내용]을 사용하시면 됩니다.


🔎 참조 타입 주의점

 const array = [1, 2, 3];
 array.push(4);

위 코드를 보고 push를 하면 어떻게 될 것 같습니까? 다들 array 변수가 const라서 값이 삽입 되지 않을거라 생각을 했을 겁니다. 하지만 놀랍게도 배열에 값이 추가가 됩니다. 그 이유를 살펴보겠습니다.

참조 타입의 경우 배열이 저장된 메모리 위치를 가리키는 주소만을 저장하므로 새로운 원소를 추가를 했다고 주소를 나타내는 포인터가 바뀌지 않았기 때문입니다. 따라서 상수로 저장된 값은 포인터로 주소만을 나타내고 이 값은 바뀌지 않았기 때문입니다.

댓글남기기