[JavaScript] 모던 자바스크립트 Deep Dive로 배우는 JS #4 변수(2)
TIL(Today I Learned) 🧑🏻💻
4. 변수(2)
4.4 변수 선언의 실행 시점과 변수 호이스팅
console.log(score); // undefined
var score; // 변수 선언문
ReferenceError가 발생할 것처럼 보이지만, 에러는 발생하지 않고 undefined가 출력된다
-
변수 선언(선언 단계와 초기화 단계)이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임(runtime)이 아니라 그 이전 단계에서 먼저 실행되었다.
-
자바스크립트 엔진은 런타임(runtime) 이전에 변수 선언을 포함한 모든 선언문(변수 선언문, 함수 선언문 등)을 소스코드에서 찾아내 먼저 실행한다.
-
변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅(variable hoisting)이라 한다.
-
변수 선언뿐 아니라 var, let, const, function, function*, class 키워드를 사용해서 선언하는 모든 식별자(변수, 함수, 클래스 등)는 호이스팅된다.
4.5 값의 할당
var score; // 변수 선언
score = 80; // 값의 할당
var score = 80; // 변수 선언과 값의 할당
자바스크립트 엔진은 변수 선언과 값의 할당을 하나의 문으로 단축 표현해도 변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다.
console.log(score); // undefined
var score; // 변수 선언
score = 80; // 값의 할당
console.log(score); // 80
변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
console.log(score); // undefined
var score; // 변수 선언문
ReferenceError가 발생할 것처럼 보이지만, 에러는 발생하지 않고 undefined가 출력된다
변수 선언(선언 단계와 초기화 단계)이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임(runtime)이 아니라 그 이전 단계에서 먼저 실행되었다.
자바스크립트 엔진은 런타임(runtime) 이전에 변수 선언을 포함한 모든 선언문(변수 선언문, 함수 선언문 등)을 소스코드에서 찾아내 먼저 실행한다.
변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅(variable hoisting)이라 한다.
변수 선언뿐 아니라 var, let, const, function, function*, class 키워드를 사용해서 선언하는 모든 식별자(변수, 함수, 클래스 등)는 호이스팅된다.
var score; // 변수 선언
score = 80; // 값의 할당
var score = 80; // 변수 선언과 값의 할당
자바스크립트 엔진은 변수 선언과 값의 할당을 하나의 문으로 단축 표현해도 변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다.
console.log(score); // undefined
var score; // 변수 선언
score = 80; // 값의 할당
console.log(score); // 80
변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
이전 값 undefined가 저장되어 있던 메모리 공간을 지우고 그 메모리 공간에 할당 값 80을 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그곳에 할당 값 80을 저장한다는 점에 주의하자.
4.6 값의 재할당
var score = 80; // 변수 선언과 값의 할당
score = 90; // 값의 재할당
var 키워드로 선언한 변수는 선언과 동시에 undefined로 초기화되기 때문에 엄밀히 말하자면 변수에 처음으로 값을 할당하는 것도 사실은 재할당이다.
- 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수(constant)라 한다.
변수 재할당시 새로운 메모리 공간을 확보하고 그 메모리 공간에 숫자 값을 저장한다는 것에 주의하자.
- 어떤 식별자와도 연결되어 있지 않은 불필요한 값들은 가비지 콜렉터(garbage collector)에 의해 메모리에서 자동 해제된다. 단, 메모리에서 언제 해제될지는 예측할 수 없다.
4.7 식별자 네이밍 규칙
- 식별자는 다음과 같은 네이밍 규칙을 준수해야한다.
- 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다.
- 단, 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)로 시작해야 한다. 숫자로 시작하는 것은 허용되지 않는다.
- 예약어는 식별자로 사용할 수 없다.
-
하나의 문에 여러 개의 변수를 선언할 수 있지만 가독성이 나빠지므로 권장하지 않는다.
-
네이밍 컨벤션
// 카멜 케이스(camelCase)
var firstName;
// 스네이크 케이스(snake_case)
var first_name;
// 파스칼 케이스(PascalCase)
var FirstName;
- 자바스크립트에서는 일반적으로 변수나 함수의 이름에는 카멜 케이스를 사용하고, 생성자함수와 클래스의 이름에는 파스칼 케이스를 사용한다.
새로운 용어 정리
-
가비지 콜렉터(garbage collector): 애플리케이션이 할당(allocate)한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는(어떤 식별자도 참조하지 않는) 메모리를 해제(release)하는 기능. 자바스크립트는 가비지 콜렉터를 통해 메모리 누수(memory leak)을 방지한다.
-
메모리 누수(memory leak): 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상. 할당된 메모리를 사용한 다음 반환하지 않는 것이 누적되면 메모리가 낭비된다.
-
언매니지드 언어(unmanaged language): 메모리 제어 기능을 제공하는 언어 (ex: c, c++ ...), 성능 확보가 가능하지만 반대의 경우 치명적 오류를 생산할 가능성이 있다.
-
매니지드 언어(managed language): 메모리 관리 기능을 언어에서 담당하여 직접적인 메모리 제어가 허용되지 않는 언어 (ex: javascript...), 일정한 생산성을 확보할 수 있지만 성능 면에서 어느 정도의 손실을 감수해야한다.
참고 문헌
* 모던 자바스크립트 Deep Dive ( 자바스크립트의 기본 개념과 동작 원리 ) / 이웅모 지음
Author And Source
이 문제에 관하여([JavaScript] 모던 자바스크립트 Deep Dive로 배우는 JS #4 변수(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chillihc/JavaScript-모던-자바스크립트-Deep-Dive로-배우는-JS-4-변수2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)