모든 애플리케이션은 복잡해보여도 결국 데이터를 받아서 새로운 데이터를 도출하는 역할을 합니다.
그리고 그 데이터를 처리하는데 필요한 것이 변수입니다.
const sum = 10 + 20;
// 위의 식을 자바스크립트가 만났을 때 해석하기위해 필요한 것
// 1. 10, 20이라는 리터럴에 대한 의미
// 2. + 연산자에 대한 의미
// 연산은 CPU
// 데이터저장은 memory
// 위의 식을 자바스크립트가 만났을 때 해석하는 방법
// 1. 10과 20인 숫자리터럴을 메모리의 임의의 공간에 2진수 형태로 저장한다. ( 이때 저장된 메모리주소를 기억해둔다 )
// 2. CPU에서 메모리주소를 읽어서 연산결과를 만들어내고 연산결과를 임의의 메모리공간에 2진수 형태로 저장한다.
// 3. 이때 30이 저장된 메모리공간을 반환해줘서 sum이라는 변수에 이진수형태로 30이 저장된 메모리공간의 주소가 저장된다.
이때 sum
을 변수라고 부르며, 변수란 하나의 값을 저장하기 위해 확보한 메모리 공간 자체를 의미한다.
간단하게 말하면 값을 가리키는 위치값을 상징적으로 부르는 이름
JavaScript
에서는 C
나 C++
의 포인터처럼 메모리공간에 직접 접근할 수 있는 방법이 없습니다.
할당
: 변수에 값을 저장하는 행위 ( 대입 or 저장이라고도 부름 )참조
: 변수에 저장된 값을 읽는 행위식별자
: 어떤 값을 구분해서 식별할 수 있는 이름을 의미 ( 변수명, 함수명, 클래스명 등 )변수 선언이란 값을 저장하기 위한 메모리공간을 확보하고, 변수 이름과 메모리공간을 맵핑하는 행위를 의미한다.
변수 선언에 의해서 확보된 메모리공간은 변수가 해제되기 전까지 누구도 그 공간을 사용할 수 없도록 보호된다.
변수선언에는 var
, let
, const
등을 사용한다.
변수선언단계
: 변수이름을 등록해서 자바스크립트 엔진에서 존재를 알림변수초기화단계
: 변수에 초기값을 undefined
로 넣어줌변수에 값을 할당하는 단계
자바스크립트는 코드를 해석할 때 코드평가단계
와 런타임
이 나눠져있다.
코드평가단계
: 코드가 유효한 코드인지 확인하는 단계, 호이스팅이 일어남런타임
: 코드를 한줄씩 실행하는 단계변수에 새로운 값을 넣을 때는 같은 메모리공간에 값을 지우고 새로운 값을 넣는 것이 아니고,
새로운 메모리공간에 값을 넣고 메모리의 주소를 변경시킨다.
즉, 아래의 예시에서 처음 v
와 마지막 v
는 다른 메모리공간을 가리킨다.
console.log(v); // undefined
var v; // 변수 선언 ( 코드평가단계에서 실행... 호이스팅 )
v = 10; // 값의 할당 ( 런타임에서 실행 )
console.log(v); // 10
변수 재할당이란 변수에 값을 변경하는 행위를 말한다.
var v = 10; // 변수 선언과 변수 초기화
v = 20; // 변수 재할당
위 예시에서 일어나는 일
1. 메모리공간을 undefined
로 초기화하고 해당 메모리주소를 v
에 넣는다.
2. 새로운 메모리공간을 10으로 초기화하고 해당 메모리주소를 v
에 넣는다.
3. 새로운 메모리공간을 20으로 초기화하고 해당 메모리주소를 v
에 넣는다.
그러면 결과적으로 undefined
와 10이 들어가 있는 메모리공간이 생겨서 메모리낭비가 발생하는데
이를 해결하기위해 자바스크립트의 가비지콜렉터가 참조되지않는 메모리공간의 할당을 해제한다.
_
, $
제외한 문자는 사용금지camelCase
, snake_case
, PascalCase
중 하나의 규칙만 적용하기 ( 대부분 PascalCase
사용 )const v = 10;
이면 v
에 10이 들어있는 것이 아니고, v
는 10이 2진수형태로 들어가 있는 메모리의 주소값을 가지고 이를 변수라고 부른다.
가비지콜렉터에서 참조되지않는 메모리공간이란 접근할 수 있는 식별자가 없는 값을 의미합니다.