변수랑 무엇인가? 왜 필요한가?
변수(Variable) : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
var result = 10 + 20;
10 + 20이라는 연산을 할 때 컴퓨터는 10과 20을 각각 메모리 임의의 위치에 저장하고, 연산된 결과인 30을 임의의 위치에 저장한다.
연산된 결과인 30이 저장된 메모리에 직접 접근해서 사용할 수 없기 때문에, 변수인 'result'를 통해 메모리 주소값을 참조해 값을 읽어들여 사용할 수 있다.
- 변수명 : 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름
- 변수값 : 변수에 저장된 값
- 할당(대입, 저장) : 변수에 값을 저장하는것
- 참조 : 변수에 저장된 값을 읽어 들이는 것
자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해서 저장된 값을 반환한다.
식별자(Identifier)
식별자 : 어떤 값을 구별해서 식별할 수 있는 고유한 이름
식별자는 값이 아닌 메모리 주소를 기억하고 있다. 식별자는 메모리 주소와 매핑 관계를 맺으며, 이 매핑 정보도 메모리에 저장된다.
식별자는 메모리 주소에 붙인 이름이다.
변수, 함수, 클래스 등의 이름과 같은 식별자가 있으며 네이밍 규칙을 준수해야 하며, 선언(declaration)을 통해 자바스크립트 엔진에게 존재를 알린다.
변수 선언
변수 선언 : 값을 저장할 메모리 공간을 확보하고 변수명과 확보된 메모리 공간의 주소를 매핑해서 값을 저장할 수 있게 준비하는 것
변수를 사용하기 위해서는 반드시 선언이 필요하다.
var, let, const 키워드를 사용해 변수를 선언할 수 있다. (ES6부터 let, const 키워드 도입)
var score; // 변수 선언(변수 선언문)
위와 같이 변수를 선언하면 값을 저장할 공간을 확보하고 메모리 주소와 변수명을 매핑한다.
확보된 메모리 공간에는 자바스크립트 엔진에 의해 암묵적으로 undefined라는 값이 할당되어 초기화된다.
변수 선언은 2단계에 걸쳐 수행한다.
1. 선언 단계 : 변수 이름을 등록해서 자바스크립트에게 변수의 존재를 알린다.
2. 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.
만약, 초기화 단계를 거치지 않으면 메모리 공간에는 쓰레기 값이 있을 수 있다.
그러므로 암묵적으로 undefined로 할당해 초기화한다.
※ 변수명은 어디에 등록되는가?
변수명을 비롯한 모든 식별자(변수, 함수, 클래스 등)은 "실행 컨텍스트"에 등록된다.
변수 선언의 실행 시점과 변수 호이스팅
console.log(score); // undefined
var score; // 변수 선언문
위의 예제를 보면 참조 에러(ReferenceError)가 발생할 것으로 예상되지만 undefined 로그가 출력이 된다.
그 이유는 자바스크립트 엔진은 모든 선언문을 런타임(소스 코드가 한 줄씩 순차적으로 실행되는 시점)이 아니라 그 이전 단계에서 먼저 실행하기 때문이다.
이와 같이, 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 '변수 호이스팅'이라 한다.
변수 선언 및 var, let, const, function, function*, class 키워드를 사용하는 식별자(변수, 함수, 클래스)는 호이스팅된다.
호이스팅을 통해 변수는 메모리에 할당되고, 식별자는 해당 메모리 주소를 가리키게 됩니다.
하지만, 변수 값은 값 할당 코드가 실행될 때 할당이 된다.
값의 할당
변수에 값을 할당(대입, 저장)할 때는 할당 연산자 '='를 사용해 우변의 값을 좌변의 변수에 할당한다.
// case1
var score; // 변수 선언
score = 80; // 값의 할당
// case2
var score = 80; // 변수 선언과 값의 할당
위의 2개 모두 정확히 동일하게 동작한다.
그 이유는 변수 선언은 런타임(소스 코드가 한 줄씩 순차적으로 실행되는 시점)이 아니라 그 이전 단계에서 먼저 실행되지만, 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행되기 때문이다.
- 변수 선언 : 런타임 이전에 실행
- 값의 할당 : 런타임에 할당 코드를 만나면 실행
console.log(score); // undefined
var score = 80; // 변수 선언 및 값의 할당
console.log(score); // 80
var score; // 변수 선언
score = 80; // 값의 할당
// 1. score 변수를 선언하면 임의의 메모리 공간을 할당받아서 score는 그 메모리 주소를 가리킨다.
// 2. score = 80;에서 값을 할당할 때 undefined 주소가 아닌 임의의 주소 공간에 80을 할당한다.
값의 재할당
재할당 : 이미 값이 할당되어 있는 변수에 새로운 값을 또 다시 할당하는 것
var score = 80; // 변수 선언과 같이 할당
score = 90; // 값의 재할당
값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 아니라 상수(constant)라 한다.
ES6에서 const 키워드를 사용해 변수를 단 한 번만 할당할 수 있는 변수로 선언할 수 있다.(const를 사용해 상수를 표현)
score 변수의 이전 값인 undefined와 80은 어떤 식별자와도 연결되지 않다.
아무도 사용하지 않고 있으니 필요하지 않은 값으로 판단하고 이 불필요한 값들은 '가비지 컬렉터'에 의해 메모리에서 자동으로 해제된다.
단, 메모리에서 언제 해제될지는 예측할 수 없다.
식별자 네이밍 규칙
식별자는 다음과 같은 네이밍 규칙을 준수해야 한다.
1. 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다.
2. 단, 식별자는 특수문자를 제외한 문자, 언더스코어(_), 달러 기호($)로 시작해야 한다. 숫자로 시작하는 것은 허용하지 않는다.
3. 예약어는 식별자로 사용할 수 없다.
// 1. 카멜 케이스(camelCase)
var firstName;
// 2. 스네이크 케이스(snake_case)
var first_name;
// 3. 파스칼 케이스(PascalCase)
var FirstName;
// 4. 헝가리언 케이스(typeHungarianCase)
var strFirstName; // type + identifier
var $elem = document.getElementById('myId') // DOM 노드
var observable$ = fromEvent(document, 'click'); // RxJS옵저버블
'프론트엔드 > JavaScript' 카테고리의 다른 글
디바운스(Debounce), 쓰로틀(Throttle) (0) | 2024.11.17 |
---|---|
[JS] Promise 객체 (0) | 2024.11.15 |
[모던 자바스크립트 Deep Dive] 05장 - 표현식과 문 (3) | 2024.11.09 |
[ESM] ES Module에 대해 (3) | 2024.11.06 |
CSP(Content Security Policy) (0) | 2024.11.04 |