변수는 왜 필요한가
메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체이다.
메모리 셀 하나의 크기는 1바이트(8bit)이며, 컴퓨터는 메모리셀의 크기, 1바이트로 데이터를 저장하거나 읽어들인다.
각 셀은 고유의 메모리 주소를 가지며, 메모리 주소는 말 그대로 메모리 공간의 위치를 나타낸다.
10 + 20
숫자 값 10, 20이 메모리 상의 임의의 우치(메모리 주소)에 기억되고, CPU는 이 값을 읽어들여 연산을 수행한다.
연산을 끝냈다고 해보자. 그럼 메모리에는 10, 20, 30(연산결과)이 담길 것이다.
여기서 문제는, CPU가 연산하여 만들어 낸 숫자 30을 재사용할 수 없다는 것이다.
30을 재사용하고 싶다면 메모리 주소를 통해 연산결과 30이 저장된 메모리 공간에 직접 접근해야한다.
하지만 자바스크립트는 메모리 주소를 통해 값에 직접 접근하는 것을 허용하지 않는다.
만약, 실수로 운영체제가 사용하고 있는 값을 변경하면 시스템을 멈추게하는 치명적인 오류를 범할 수 있기 때문이다.
때문에, 프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어들여 재사용하기 위해 변수라는 메커니즘을 제공한다.
var result = 10 + 20
console.log(result)
변수(위 result)는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.
간단히 값의 위치를 가르키는 상징적인 이름이라고 할 수 있다(변수의 이름을 식별자라고 부르기도 함).
변수는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장 된 메모리 공간의 주소로 치환되어 실행된다.
따라서 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요가 없으며, 변수를 통해 안전하게 값에 접근할 수 있다.
변수 선언과 실행시점과 변수 호이스팅
변수의 선언은 런타임(소스코드가 한 줄씩 실행되는 시점)이 아니라 그 이전에 먼저 실행된다.
변수의 선언문이 코드의 선두로 끌어 올려진 것저럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라 한다.
console.log(score);
score = 80
var score;
console.log(score);
예제로 주어졌던 4-10의 두번째 console.log 값을 추측해보자.
- 자바스크립트 엔진을 실행하기 전, 선언된 변수들이 undefind로 호이스팅 된다.
- 때문에 위 변수를 선언하기 전 console.log값이 reference Error 가 발생하지 않고 undefined가 출력된다.
- score에 80이 담긴다.
- 두번째 console.log 값에는 score 식별자는 80이 담긴 값의 메모리 주소를 향하고 있으므로 80이 출력된다.
값의 재할당
재할당이란 값이 할당되어있는 변수에 새로운 값을 또 다시 새로운 값을 할당하는 것을 말한다.
var score = 40
score =90
var키워드로 선언된 변수는 값을 재할당 할 수 있다.
재할당은 현재 변수에 저장된 값을 버리고 새로운 값을 저장하는 것이다.
var로 선언한 변수는 선언과 동시에 undefined로 초기화되기 때문에 엄밀히 말하면 변수에 처음 값을 할당하는 것도 재할당이라고 할 수 있다.
값을 재할당 할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수(constant)라고 한다.
상수는 한번 정해지면 변하지 않는 값이다. 즉 한번만 할당할 수 있는 변수다.
const 키워드를 사용하면 상수를 표현할 수 있다(단지 상수만을 위해 사용하지는 않는다).
값이 재할당되면 이전에 값에 있는 메모리 공간에 이전 값이 없어지고 새로운 값이 저장되는게 아닌, 새로운 공간을 확보하여 그 메모리 공간에 새로운 값을 저장한다.
이전에 할당된 값들은 어떤 식별자(변수)와도 연결되어있지 않다.
이런 불필요해진 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제된다. 단, 메모리에서 언제 해제될지는 예측할 수 없다.
* 가비지 콜렉터 : 어플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더이상 사용되지 않는 메모리를 해제하는 기능, 메모리 누수를 방지해준다. 자바스크립트는 메모리제어를 개발자가 명시적으로 할당하고 해제하게 하지 않고(메모리 제어 허용X), 가비지 콜렉터에게 맡기는 메니지드 언어이다.
'Read > Morden Javascript Deep Dive' 카테고리의 다른 글
[Modern Javascript Deep Dive] 8~9장 인사이트 정리 (1) | 2023.11.11 |
---|---|
[Modern Javascript Deep Dive] 8장 제어문 (0) | 2023.02.09 |
[Modern Javascript Deep Dive] 7장 연산자 (0) | 2023.02.08 |
[Modern Javascript Deep Dive] 6장 데이터 타입 (0) | 2023.02.03 |
[Modern Javascript Deep Dive] 5장 표현식과 문 (0) | 2023.02.02 |