개발지식 및 기초지식/JAVASCRIPT

js기초 - 변수

jeong_ga 2022. 7. 14. 16:09

모던자바스크립트 DEEPDIVE - chapter 4 변수

변수

컴퓨터는 연산을 위한 장치와 기억을 위한 장치가 따로 존재하며 연산 후 이를 저장한 곳에서 해당 연산 값을 꺼내올 수 없다. (메모리 주소를 사용하는 것은 오류를 발생할 수 있기 때문에 금지되었다.)

  • 하나의 값을 저장하기 위해 확보한 메모리 공간 그자체
  • 메모리 공간을 식별하기 위해 붙인 이름
  • 값의 위치를 가리키는 상징적인 이름
  • 변수 이름을 사용하여 참조를 요청하면 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해 값을 반환

할당

  • 변수에 값을 대입하는 것

참조

  • 변수에 저장된 값을 읽는 것

식별자

메모리 주소에 뭍인 이름

  • 변수 이름을 식별자라고도 부른다.
  • 어떤 값을 구별해서 식별할 수 있는 고유한 이름
  • 식별자는 값이 저장되어 있는 메모리 주소와 매핑관계를 맺으며 이 매핑 정보도 메모리에 저장되어야 한다. -> 식별자는 값이 아니라 메모리 주소를 기억!!
  • 변수, 함수, 클래스의 이름은 모두 식별자라고 할 수 있다.

변수선언

값을 저장하기 위한 메모리 공간 확보 -> 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비

변수 선언에 의해 확보된 메모리 공간은 확보가 해제되기 전까지는 확보된 메모리 공간을 사용할 수 없기 때문에 안전하다.

var score; 라고 선언을 했다면 이것은 var라는 키워드를 이용하여 score라는 변수명을 선언한 것이다. (값은 undefined 이다.)

자바스크립트 엔진은 다음과 같은 단계로 수행된다.

  1. 선언단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
  • 만약 선언을 하지 않은 채 사용하려고 한다면 ReferenceError가 발생한다!
  1. 초기화단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined 를 할당해 초기화 한다.
  • 일반적으로 초기화단계란 변수가 선언된 이후 최초로 값을 할당하는 것을 말한다.

변수명은 실행 컨텍스트에 등록되다.

실행컨텍스트란?

  • 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행결과를 실제로 관리하는 영역을 뜻함!
  • 변수명과 변수값은 실행컨텍스트 내에서 key/value의 형식인 객체로 등록되어 관리된다.

변수 선언의 실행시점과 변수 호이스팅

변수 선언은 코드가 실행되는 시점(런타임)이 아닌 그 이전 단계에서 먼저 실행되기 때문에 변수 호이스팅이 발생된다.

변수 호이스팅이란?

변수를 선언하기 전에 변수 사용을 먼저 했다면 referenceError가 발생해야 하지만 변수가 실행되는 시점이 아닌 그 이전 단계에서 이미 변수 선언이 완료되었기 때문에 변수가 선언되지 않았다는 referenceError대신 값이 없다는 undefined가 나오는 오류를 뜻함

소스코드 실행을 위한 준비 단계인 소스코드 평과 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문을 먼저 실행!!

후에 소스코드를 한줄 씩 실행한다(인터프리터)

변수 선언문이 코드의 가장 앞으로 끌어 올려진 것처럼 동작하는 자바스크립트의 특징을 변수 호이스팅이라고 말함!

  • 변수 뿐만이 아닌 함수, 클래스와 같은 키워드를 사용해서 선언하는 식별자는 모두 호이스팅된다.

값의 할당

var score; //변수 선언

score = "값의 할당";

var score = "변수 선언과 값의 할당이 동시에 이루어짐";

// 한번에 작성하여도 자바스크립트 엔진은 2개의 문으로 나누어 실행한다.

차례로 입력해도 변수 선언과 값의 할당은 동시에 이루어지지 않는다.

변수선언은 런타임 이전에 먼저 실행되지만 값의 할당은 순차적으로 진행된다.

예제

console.log("첫번째", a); //첫번째 undefined

a = 90;

var a;

console.log("두번째", a);//두번째 90
  • 변수선언은 런타임 이전에 먼저 실행되므로 할당이 먼저 이루어졌음에도 불구하고 값 할당이 이루어졌다.

값의 재할당

var는 값의 재할당을 진행할 수 있다. (상수인 const는 불가능) 엄밀히 말하자면 var는 선언과 동시에 초기화가 이루어지기 때문에 처음 값을 넣었을 대에도 재할당이라고 할 수 있다.

  • 변수선언, 변수할당과 마찬가지로 해당 메모리 공간에 값을 수정하는 것이 아닌 새로운 공간을 확보하고 그 공간에 값을 저장한다.
  • 할당, 재할당이 진행되어 식별자가 참조하지 않는 메모리들은 가비지 메모리라고 하며 가비지 콜렉터를 통해 사용되지 않는 메모리를 해제한다.
  • js는 매니지드 언어로 메모리의 할당과 해제를 위한 메모리 관리 기능을 언어가 담당하고 있다.
  • C언어는 언매니지드 언어로 개발자가 메모리의 할당과 해제를 주도할 수 있다.

식별자 네이밍 규칙

  • 특수문자를 제외한 문자, 숫자, _, $ 를 사용할 수 있다.
  • 숫자로 시작할 수는 없다.
  • 예약어는 식별자로 사용할 수 없다.

규칙은 아니지만 기억하면 좋을 것

  • 대소문자를 구별한다!

예약어

  • await, break, case, catch, class, const, continue, debugger, default, delete, do, else, enum, export, extends, falss, finally, for, function, if, implements, import, in, instanseof, inroeface, let, new, null, pakage, private, protected, public, return, super, static, switch, this, theow, true, try, typeOf, var, void, while, with, yield
  • *표는 식별자로 사용이 가능하나 strict mode에서는 사용이 불가능 한 것들이다.

변수명도 식별자이기 떄문에 위 규칙에 따라 지정해야 한다.

'개발지식 및 기초지식 > JAVASCRIPT' 카테고리의 다른 글

js기초 - 제어문  (0) 2022.07.14
js기초 - 연산자  (0) 2022.07.14
js기초 - 데이터타입  (0) 2022.07.14
js기초 - 표현식과 문  (0) 2022.07.14
js기초 - node.js, npm, REPL  (0) 2022.07.14