10 + 20 // 컴퓨터는 이것을 어떻게 연산할까?
사람이 이 식을 계산하기 위해서는 10과 20의 의미, +의 의미를 알고 있어야 한다. '10 + 20'의 의미도 해석할 수 있어야 한다. 자바스크립트 엔진이 이 코드를 계산하려면 먼저 10, 20, +라는 기호의 의미를 알고 있어야 하며, '10 + 20'이라는 표현식의 의미도 해석(parsing)할 수 있어야 한다.
사람은 계산과 기억을 두뇌에서 처리하지만, 컴퓨터는 연산과 기억을 수행하는 기관이 CPU, Memory로 나눠져있다.
-Memory? 데이터를 저장할 수 있는 메모리 셀의 집합체로, 메모리 셀 하나의 크기는 1바이트이며, 컴퓨터는 메모리 셀의 크기, 즉 1바이트 단위로 데이터를 저장하거나 읽는다. 메모리에 저장되는 모든 값은 2진수로 저장된다.
CPU가 연산을 통해 '30'을 도출해내도 그 숫자를 재사용할 수 없다. 재사용을 위해서는 메모리 주소를 통해 연산 결과 30이 저장된 메모리 공간에 직접 접근하는 것 외에는 방법이 없다. 하지만 메모리 주소를 직접 제어하는 것은 치명적인 오류를 발생시킬 수 있다.
프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어 들여 재사용하기 위해 변수라는 매커니즘을 제공한다.
// 변수는 기본적으로 하나의 값을 저장(할당)한다.
let userName = 'john';
let userId = 1;
//그러나 객체나 배열을 이용해 여러 개의 값을 하나의 변수로 선언할 수 있다.
const user = { id: 1, name: 'john' };
const users = [{
id: 1, name: 'john'
}, {
id: 2, name: 'angela'
}]
;
변수 선언?
값을 저장하기 위한 메모리 공간을 확보하고, 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것
let score;
// score의 값는 아직 할당되지 않았으므로 undefined다.
// 변수뿐만 아니라 모든 선언되지 않은 식별자(함수, 클래스 등)에 접근하면 'ReferenceError(참조 에러)'가 발생한다.
console.log(userName);
let userName;
// 로그에는 undefined가 출력된다.
변수 선언보다 변수를 참조하는 코드가 앞에 있으므로 ReferenceError가 발생할 것 같으나, undefined이 출력된다. 이유는 변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임(runtime)이 아니라 그 이전 단계에서 먼저 실행되기 때문이다.
변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅(variable hoisting)이라고 한다.
console.log(userName) // undefined
let userName;
userName = 'john'; // let userName = 'john'으로 한 줄로 표현할 수 있다.
console.log(userName) // john이 출력된다.
console.log(userName)
userName = 'john'
const userName;
console.log(userName); // 결과는 ??
let userName = "john";
userName = "ellie";
console.log(userName); // ellie가 출력된다.
값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수(constant)다.
변수에 값을 재할당하면 userName 변수의 값을 이전 값 'john'에서 재할당된 'ellie'로 변경된다. 처음 값을 할당했을 때와 마찬가지로 이전 값 'john'이 저장되어 있던 메모리 공간을 지우고 그 메모리 공간에 재할당 값 'ellie'를 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그 메모리 공간에 'ellie'를 저장한다.
이전에 저장된 'john'은 아무도 사용하고 있지 않고 필요하지 않은 것인데, 이런 값들은 Gabage Collector에 의해 메모리에서 자동 해제된다.
let firstName; // camelCase
let first_name; // snake_case
let FristName; // PascalCase
let strFirstName // type + identifier
let $elem = document.getElementById('myId') // DOM노드
let obserable$ = fromEvent(document, 'click') // RxJS 옵저버블
(이 글은 모던자바스크립트 Deep Dive를 요약 및 정리한 것입니다.)