4장 변수
4.1 변수란 무엇인가? 왜 필요한가?
변수 Variable : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
변수는 프로그래밍 언어에서 값을 저장하고 참조하는 매커니즘으로, 값의 위치를 가리키는 상징적 이름이다.
4.2 식별자
식별자 identifier : 어떤 값을 구별해서 식별할 수 있는 고유한 이름, (변수명)
값은 메모리 공간에 저장되어 있다. 식별자는 메모리 공간에 있는 어떤 값을 구별해서 식별할 수 있어야 한다. 이를 위해 식별자는 메모리 주소를 기억해야 한다. 즉, 식별자는 값이 저장된 메모리 주소와 매핑관계를 맺으며, 매핑 정보도 메모리에 저장되어야 한다.
식별자는 값이 아닌 메모리 주소를 기억하고 있다.
식별자는 변수 이름에만 국한되지 않고 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름은 모두 식별자라 부른다.
4.3 변수 선언
변수 선언 variable declaration : 변수를 생성하는 것. 값을 저장하기 위한 메모리 공간을 확보하고, 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것을 의미한다. 확보된 공간은 해제되기 전까지 보호되므로 안전하게 사용 가능하다.
변수를 사용하려면 반드시 선언이 필요하다. 선언 키워드는 var, let, const 키워드가 있다.(var는 사용x)
4.4 변수 선언의 실행 시점과 변수 호이스팅
자바스크립트는 인터프리터에 의해 한 줄씩 순차적으로 실행된다. 그리고 선언되지 않은 변수를 실행하면 참조 에러가 발생한다.
그렇다면 다음과 같은 코드는 어떻게 실행될까?
선언되지 않은 변수를 실행했으므로 참조러가 발생해야 한다.
하지만 실제로 실행하면 undefined가 출력된다.
왜 에러가 아닌 undefined가 출력될까?
그 이유는 변수 선언은 소스코드가 실행되는 시점(런타임) 보다 이전 단계에 실행되기 때문이다.
이처럼 변수 선언문이 코드 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 특징을 변수 호이스팅이라고 한다.
하지만 let과 const 등의 키워드에서는 호이스팅이 작동하지 않는 것처럼 느껴지는데 이는 각 키워드의 실행 컨텍스트를 이해해야한다. 참고 참고1
+ a 엥? var은 되는데 let은 안되누?
책의 사례는 var을 사용했는데, 이를 let에 적용해보니 되지 않아 검색해봄.
자바스크립트 엔진은 다음의 3단계에 거쳐 변수를 생성된다.
> >
var 키워드의 경우, 선언과 초기화 단계가 한번에 이뤄진다. 스코프에 변수를 등록하고, 메모리에 변수 공간을 확보한 후, undefined로 초기화한다. 따라서 변수 선언 이전에 변수에 접근해도 undefined가 반환된다.
let 키워드의 경우, 선언과 초기화가 분리되어 진행된다. 스코프에 변수를 등록하지만 초기화는 변수 선언문에 도달했을때 이뤄진다. 초기화 이전에 변수에 접근하려하면 참조 에러가 발생한다. 변수를 위한 메모리 공간이 확보되지 않았기 때문이다.
즉, var 키워드는 (선언&초기화) 가 한번에 작동하기에 가능햇던 것.
4.5 값의 할당
변수에 값을 할당하고 싶다면 할당 연산자 = 을 사용한다.
할당 연산자는 우변의 값을 좌변의 변수에 할당하는 역할을 한다.
변수 선언은 런타임 이전에 먼저 실행되지만, 값의 할당은 런타임에 실행된다.
4.6 값의 재할당
재할당: 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것을 말한다. 그래서 변수라고 한다.
값을 재할당할 수 없다면 (const) 변수가 아닌 상수(constant)라고 한다. 즉, 상수는 단 한 번만 할당할 수 있는 변수다. 하지만 반드시 상수만을 위해 사용하지는 않는다…(15장에 설명)
재할당이 진행되면서 더 이상 사용되지 않는 값은 가비지 콜렉터에 의해 정리된다. 가비지 콜렉터는 어플리케이션이 할당한 메모리 공간을 주기적으로 검사하면서 더 이상 사용되지 않는 메모리를 해제하는 기능을 말한다. (어떤 식별자도 참조하지 않는 메모리 공간을 의미한다.)
unmanaged language & managed language
메모리 관리 방식에 따라 언매니지드 언어와 매니지드 언어로 구분된다.
C 와 같은 언매니지드 언어는 개발자가 명시적으로 메모리를 할당하고, 해제하면서 개발자의 능력에 따라 주도적으로 성능을 끌어올릴 수 있다.
반면, JS 같은 매니지드 언어는 메모리 할당과 해제를 언어 차원에서 진행하면서 개발자의 관여를 막는다. 그래서 언매니지드 언어에 비해 성능이 감소한다.
4.7 식별자 네이밍 규칙
식별자는 다음과 같은 네이밍 규칙을 준수해야 한다.
특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다.
단, 숫자로 시작하는 것은 허용하지 않는다.
예약어는 식별자로 사용할 수 없다.
예약어 : 프로그래밍 언어에서 사용되고 있거나 사용될 예정인 단어
debugger
default
delete
do
else
enum
export
extends
false
finally
for
function
if
implements
import
in
instanceof
interface
let
new
null
package
private
protected
public
return
super
static
switch
this
throw
true
try
typeof
var
void
while
with
yield
i 식별자로 사용 가능하나 strict mode에서는 사용 불가
쉼표로 구분해 하나의 문에서 여러 개를 한번에 선언할 수 있다(가독성이 나빠져 권장 x)
ES5부터 유니코드 문자를 허용하므로 한글로 식별자를 만들 수 있음(알파벳 권장)
대소문자를 구별함
변수의 존재 목적을 쉽게 이해할 수 있도록 의미를 명확히 표현해야 한다.
Last updated
Was this helpful?