변수와 데이터 타입 (기본형 VS 참조형)
변수란 변경 가능한 데이터가 담길 수 있는 컨테이너다. 여기서 데이터는 string, number, object 등 어떤 자바스크립트 데이터 타입이든 될 수 있다.
변수 선언하기
ES6 이전에는 변수를 선언하려면 var 키워드를 사용해야만 했는데 ES6에서 let, const가 도입되었다.
var, let으로 정의된 변수 이름은 camelCase로, const로 정의된 정수 이름은 대문자로 작성하는 관례가 있다.
var, let, const를 비교하면 아래 표와 같다.
키워드 | 스코프 | 호이스팅 | 재할당 가능 여부 | 재선언 가능 여부 |
var | 펑션 스코프 | O | O | O |
let | 블락 스코프 | X | O | X |
const | 블락 스코프 | X | X | X |
그렇다면 세 가지 키워드 중에서 뭘 사용해야 할까?
보통 가능한 const를 사용하고 loops나 재할당이 필요한 경우에는 let을 사용하도록 한다.
var는 재선언이 될 수 있어서 사용을 지양한다.
데이터 타입
자바스크립트의 데이터 타입에는 크게 두 가지가 있다. 기본형(primitive type)과 참조형(reference type)이다.
할당이나 연산시 기본형은 값이 담긴 주솟값을 복제하고, 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다.
1. 기본형, primitive type
- Numbers
- String
- Boolean
- Null
- Undefined
- Symbols
2. 참조형, reference type
- Objects
- Functions
- Collections
- Arrays
- Dates
- Other types of objects...
기본형 데이터 타입
기본형 데이터 타입은 단순하다. 프로그래밍 언어에서 가장 낮은 레벨의 수행으로 여겨지기도 한다. 객체가 아니며 메서드를 갖고 있지 않다. 그런데 문자열의 경우 자바스크립트가 기본형 문자열을 문자열 객체로 변환하여 문자열 메서드를 사용할 수 있는 특징이 있다.
기본형 데이터 타입을 선언하면 스택에 저장된다. 스택이란 컴퓨터가 데이터를 빠르게 저장하고 가져오기 위해 사용하는 데이터 구조다. 스택 상에서 변수명이 식별자가 된다.
불변성(immutability)
기본형 데이터 타입은 불변값이다. 아래 코드를 보자. 변수를 선언하면 컴퓨터는 메모리를 확보하고 이를 a라고 지정한다.
변수 a에 데이터를 할당하면 데이터를 위한 별도의 메모리에 데이터를 저장하고, 해당 주소를 변수 영역에 저장한다.
재할당을 하면 새로운 메모리 공간에 데이터를 저장하고 변수 영역을 새로운 주소를 가리키도록 한다.
이렇게 재할당을 하면 데이터 영역의 메모리를 수정하는 것이 아니라 새로운 메모리 공간에 데이터를 저장하기 때문에 불변하다고 한다.
var a; //선언
a = 1; //할당
a = "a"; //재할당
참조형 데이터 타입
참조형 데이터 타입의 사이즈는 고정된 것이 아니다. 대부분이 객체로 여겨지고 메서드를 갖는다.
참조형 데이터를 만들고 값을 할당하면, 기본형 데이터와 달리 데이터를 변수에 직접 저장하지 않는다. 변수에 저장하는 것은 데이터 타입이 저장된 메모리의 위치다.
스택에는 데이터가 저장된 메모리 위치가 저장되고 실제 데이터는 힙에 저장된다.
만약 객체1 변수를 만든뒤 객체2 변수에 객체1을 할당한다고 하자. 힙에 다른 객체가 생성될까? 해당 객체가 이미 힙에 존재하기 때문에 생성되지 않는다. 객체1, 객체2 모두 동일한 객체를 가리킬 것이다. 또한, 객체1에 변형을 일으키면 객체2에도 동일한 변형이 일어날 것이다. 이는 이들이 힙에 있는 동일한 객체를 가리키고 있기 때문이다.
레퍼런스
정재남. <코어 자바스크립트>, 위키북스, 2020
https://www.freecodecamp.org/news/primitive-vs-reference-data-types-in-javascript/