
* 모던 자바스크립트 Deep Dive을 토대로 공부한 것을 정리한 내용으로, 모든 인용문은 모던 자바스크립트 Deep Dive의 문구를 인용한 것입니다.
** 정리하다보니 너무 길어져서... 볼드 처리된 부분 위주로 읽으면 좋을 것 같습니다!
변수(variable)란,
하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위한 이름을 말한다.
자바스크립트 엔진이 자바스크립트 코드를 수행하기 위해서는 기호와 식의 의미를 기억하고 해석할 수 있어야 한다. 예를 들어 설명해보자면,
10+20
위와 같은 식을 수행하기 위해서는 + 연산자와, 좌변과 우변의 숫자 값을 모두 기억해야 한다. 사람은 이와 같은 연산을 모두 두뇌에서 하지만, 컴퓨터는 CPU를 사용하여 연산하고 메모리를 사용하여 데이터를 기억한다.
수행 과정에서 10과 20을 메모리 셀에 저장하고, 연산이 수행되면 연산 결과도 메모리에 저장될 것이다. 그러나 CPU는 연산된 값인 30을 재사용할 수 없다.
위와 같이 계산한 10+20의 값인 30을 재사용하기 위해서는 메모리 공간에 직접 접근하는 방법 뿐이다. 그러나 메모리 주소를 통해 직접 값에 접근하는 방식은
이러한 이유로 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어 들여 재사용하기 위한 메커니즘을 제공한다. 이것이 변수를 사용하는 이유이다.
변수는 프로그래밍 언어에서 값을 저장하고 참조하는 메커니즘으로, 값의 위치를 가리키는 상징적인 이름이다.
변수는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 메모리 공간의 주소로 치환되어 실행된다.
따라서, 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요 없이 변수를 통해 안전하게 값에 접근할 수 있다.
변수 이름을 식별자(identifier)라고도 한다.
식별자란 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 뜻한다.
var result = 10 + 20
위의 코드에서, 식별자 result는 값 30을 식별할 수 있다. 이를 위해 식별자 result는 값 30이 저장되어 있는 메모리 주소를 기억해야 한다.
식별자의 특징을 꼽아보자면,
변수 선언이란 변수를 생성하는 것을 말한다. 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것이다.
var score;
위의 변수 선언문은 다음과 같이 변수 이름을 등록하고 저장할 메모리 공간을 확보한다. 그러나 아직 변수에 값을 할당하지 않았다. 이때 메모리 공간은 비어있는 것이 아닌 undifined라는 값이 할당되어 초기화된다. (undifined는 자바스크립트에서 제공하는 원시 타입의 값이다.)
자바스크립트 엔진은 변수 선언에 다음과 같은 2단계를 거친다.
- 선언 단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
- 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undifined를 할당해 초기화한다.
위의 변수 선언문으로 설명하면, var score;는 선언 단계를 통해 변수 이름을 등록하고, 초기화 단계를 통해 undifined를 할당하여 초기화한다.
만약 초기화 단계를 거치지 않으면 확보된 메모리 공간에는 이전에 다른 애플리케이션의 값이 남아있을 수 있다. 이를 쓰레기 값이라고 한다. var키워드는 암묵적으로 초기화를 수행하므로 이러한 위험으로부터 안전하다.
변수 호이스팅이란 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징이다.
console.log(score);
var score;
위 예제를 살펴보면, 변수 선언문인 var score;보다 console.log(score);가 위에 있다. 코드가 순차적으로 실행되는 런타임에 변수 선언이 실행된다면 변수 선언 이전에 console.log(score);가 실행되므로 참조 에러가 발생되어야 하나, undifined가 출력된다.
이는 변수 선언이 소스코드가 순차적으로 실행되는 런타임 이전 단계에서 먼저 실행됐다는 증거이다. 이를 변수 호이스팅이라고 한다.
var score1; // 변수 선언
score1 = 100; // 값의 할당
var score2 = 80; // 변수 선언과 값의 할당
이때 주의해야 할 점은 변수 선언과 값의 할당의 실행 시점이 다르다는 것이다.
- 변수 선언 : 런타임 이전에 실행
- 값의 할당 : 런타임에 실행
예제로 설명하면,
console.log(score); // undifined
var score; // 1. 변수 선언
score = 80; // 2. 값의 할당
console.log(score); // 80
변수 선언은 런타임 이전에 실행되었으므로 처음 log를 찍었을 때는 undifined가 출력된다. 2번 시점에는 이미 undifined로 초기화되어있는 값에서 새롭게 할당한 80으로 변경되며 이후 80이 출력된다.
이때 주의할 점은, 값을 할당할 때 undifined가 저장되어 있던 메모리 공간에 80을 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 80을 저장한다는 점이다.
재할당이란 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것이다. var 키워드로 선언한 변수는 값을 재할당할 수 있다. var 키워드로 선언한 변수는 선언과 동시에 undifined로 할당되기 때문에 엄밀히 말하면 할당에서 값을 할당한 경우도 재할당이다.
var score = 80; // 변수 선언과 값의 할당
score = 90; // 값의 재할당
값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아닌 상수라고 한다.
위의 예제 코드로 설명하면, 변수에 값을 재할당하면 변수의 값은 80에서 90으로 변경된다. 이때, 이전 값 80이 저장되어 있던 메모리 공간을 지우고 메모리 공간에 재할당 값을 새롭게 저장하는 것이 아닌 새로운 메모리 공간을 확보하고 메모리 공간에 숫자 값 90을 저장한다.
이때, 80은 어떤 변수도 값으로 갖고 있지 않다. 어떤 식별자도 연결되어 있지 않기 때문에 불필요한 값이 되어 기비지 콜렉터에 의해 메모리에서 자동 해제된다. 단, 메모리에서 언제 해제될지는 예측할 수 없다.
식별자는 다음과 같은 네이밍 규칙을 준수해야 한다.
- 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다.
- 단, 식별자는 특수문자를 제외한 문자, 언더스코어, 달러 기호로 시작해야 한다. 숫라로 시작하는 것은 허용하지 않는다.
- 예약어는 식별자로 사용할 수 없다.
ES5부터 식별자를 만들 때 유니코드 문자를 허용한다. 그러나 알파벳 이외에 유니코드 문자로 명명된 식별자는 바람직하지 않다.
var first-name; // - 이 들어가므로 사용 불가
var 1st; // 숫자가 앞에 와 사용 불가
var this; // 예약어라 사용 불가
위와 같은 예시는 명명 규칙에 위배되므로 사용할 수 없다.
var firstname;
var firstName;
var FirstNAME;
자바스크립트는 대소문자를 구분하므로 위의 변수는 각각 별개의 변수이다.
값(value)는 식이 평가되어 생성된 결과를 말한다.
평가란 식을 해석해서 값을 생성하거나 참조하는 것을 의미한다.
변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름으로, 따라서 변수에 할당되는 것은 값이다.
var sum = 10 + 20;
위의 예제 sum 변수에 할당되는 것은 10+20이 평가된 결과인 숫자 값 30이다.
리터럴(literal)은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법을 말한다.
3 // 숫자 리터럴 3
위의 코드는 아라비아 숫자 3이 아닌 숫자 리터럴이다. 리터럴을 사용하면 문자열 리터럴"hello", 불리언 리터럴 true, undifined 리터럴 undifined 등을 생성할 수 있다.
표현식은 값으로 평가될 수 있는 문이다. 즉, 표현식이 평가되면 새로운 값을 생성하거나 값을 참조한다.
// 리터럴 표현식
30
'hello'
// 식별자 표현식(선언이 이미 존재한다고 가정)
sum
person.name
arr[0]
// 연산자 표현식
10 + 10
sum = 10
sum !== 10
// 함수, 메서드 호출 표현식(선언이 이미 존재한다고 가정)
square()
person.getName()
값으로 평가될 수 있는 문은 모두 표현식이므로, 위의 예제들은 모두 표현식이다.
문(statement)은 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다.
문의 집합으로 이루어진 것이 프로그램이며, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍이다.

문은 토큰으로 구성된다. 토큰이란 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 의미한다.
문은 선언문, 할당문, 조건문, 반복문 등으로 구분할 수 있다.
.
아직은 어려운 내용이 아니라서 공부하는데 크게 힘들지는 않았다. 처음부터 배운다고 생각하고 정리하니까 모든 내용을 담고 싶어서 간단하게 정리하지 못한 것 같은데, 요점을 요약하지 못하는 것 같기도 하고 나중에 내용이 어려워지면 요약하기도 어려워질 것 같아 고민이다. 4장과 5장은 이론적인 부분이 많은 것 같기도 하고 내용이 길어 예제로 설명할 것이 많은 6장과 나누어 글을 작성하였다.
책보다 더 깔끔하다 느껴질 정도로 정리를 너무 잘하셨네요 .. 👍🏻
저도 모든 내용을 담고싶단 생각에 주절주절 적다보니 엄청 길어지더라구요.. 근데 또 빼기에는 아까운 내용인 것 같아서 고민이 많습니다 ㅎㅎ.. 그럼에도 처음부터 차곡차곡 개념을 쌓아가는 모습은 아주 좋은 것 같아요! 다음 장 읽으러 가볼게욥 ^_^