header wave

Post

JS) 변수(Variable)

2022-09-20 AM 06/24
#javascript
#study

변수란?

변수 선언 :

값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 학보된 메모리 공간의 주소를 연결하여 값을 저장할 수 있게 준비하는 것이다.

변수 선언에 의해 확보된 메모리 공간은 확보가 해제되기 전까지는 누구도 확보된 메모리 공간을 사용할 수 없도록 보호되므로 안전하게 사용할 수 있다.

변수를 사용하려면 var, let, const 키워드를 사용한 선언이 필요하다.

변수의 이름은 어디에 등록될까??

변수 이름을 비롯한 모든 식별자는 실행컨텍스트에 등록된다. 실행 컨텍스트는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다. 자바스크립트 엔진은 실행 컨텍스트르르 통해 식별자와 스코프를 관리한다.

변수 등록의 단계

  1. 선언단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.

  2. 초기화 단계: 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화 한다.

  • 초기화란 선언한 이후 최초로 값을 할당하는 것

var

var 키워드의 변수 선언은 선언 단계와 초기화 단계가 동시에 진행된다.

초기화 단계를 거치지 않으면 확보된 메모리 공간에는 이전에 다른 애플리케이션이 사용했던 값이 남아있을 수 있다. 이런 값을 쓰레기값이라 한다. 따라서 메모리 공간을 확보한 다음 값을 할당하지 않은 상태에서 곧바로 변수 값을 참조하면 쓰레기 값이 나올 수 있다.

변수를 사용하려면 반드시 선언이 필요하다. 변수뿐만 아니라 모든 식별자(함수, 클래스)가 그렇다. 만약 선언하지 않은 식별자에 접근하면 ReferenceError 참조에러가 발생한다.

(참조에러는 식별자를 통해 값을 참조하려 했지만 자바스크립트 엔진이 등록된 식별자를 찾을 수 없을 때 발생하는 에러다.)

변수 선언은 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임이 아니라 그 이전 단계에서 먼저 실행된다.

자바스크립트 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서 먼저 소스코드의 평가 과정을 거치면서 소스코드를 실행하기 위한 준비를 한다. 이떄 소스코드 실행을 위한 준비 단계인 소스코드의 평가 과정에서 자바스크립트 엔진은 변수 선선을 포함한 모든 선언문(변수 선언문, 함수 선언문 등)을 소스코드에서 찾아내 먼저 실행한다. 그리고 소스코드의 평가 과정이 끝나면 비로소 변수 선언을 포함한 모든 선언문을 제외하고 한 줄 씩 순차적으로 실행한다.

console.log(kimchi);// 에러가 안뜨지롱~ undefinedvar kimchi

값의 할당

var score;// 변수 선언
score = 100;// 값의 할당var score = 100;// 변수 선언과 값의 할당

변수 선언과 값의 할당을 2개의 문으로 나누어 표현한 코드와 변수 선언과 값의 할당을 하나의 문으로 단축해 표현한 코드는 정확히 동일하게 동작한다. 즉 자바스크립트 엔진은 변수 선언과 값의 할당을 하나의 문으로 표현해도 변수 선언과 값의 할당을 2개의 문으로 각각 나누어 실행한다.

변수 선언과 값의 할당의 실행시점은 다르다. 변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 런타임에 실행된다.

console.log(score);// undefined 변수 선언은 되었지만 값의 할당이 되지 않음var score;// 1. 변수 선언
score = 80;// 2. 값의 할당console.log(score);// 80 값의 할당 후 80 출력
console.log(score);// undefinedvar score = 80;// 변수 선언 과 값의 할당console.log(score);// 80

img.png

선언 후 값을 할당할 때 undefined를 지우고 메모리 공간에 80을 할당하는 것이 아니라 새로운 메모리 공간을 확보하고 그곳에 80을 할당한다.

console.log(score);// undefined 함수 선언 완료 되었지만 값의 할당은 아직 되지 않음

score=80;// 값의 할당var score;// 런타임 이전에 선언이 완료됨console.log(score);// 80

그러면 메모리에 undefined로 남아있는 값들은 어떻게 되는 걸까?

가비지 콜렉터

- _JS is managed language_

자바스크립트 같은 매니지드 언어는 메모리의 할당 및 해제를 위한 메모리 관리 기능을 언어 차원에서 담당하고 개발자의 직접적인 메모리 제어를 허용하지 않는다. 더 이상 사용하지 않는 메모리의 해제는 가비지 콜렉터가 수행하며, 이 또한 개발자가 관여할 수 없다. 매니지드 언어는 개발자의 역량에 의존하는 부분은 상대저으로 작아져도 일정한 생산성을 확보할 수 있지만 어느 정도 손해도 발생