모던 자바스크립트 Deep Dive 스터디 3일차

김동환·2023년 6월 29일

Learn_JavaScript

목록 보기
5/10
post-thumbnail

3일차 주요 내용 정리


💡 4장 변수 (1/2)

10 + 20

  • 자바스크립트 엔진도 사람과 유사하게 코드를 실행한다. 자바스크립트 엔진이 위 자바스크립트 코드를 계산(평가evaluation)하려면 먼저 10, 20, + 라는 기호(리터럴literal 과 연산자operator)의 의미를 알고 있어야 하며, 10+20이라는 식(표현식expression)의 의미도 해석(파싱parsing)할 수 있어야한다.

변수 variable

  • 메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 높은 매우 위험한 일이다. 만약 실수로 운영체제가 사용하고 있는 값을 변경하면 시스템을 멈추게 하는 치명적인 오류가 발생할 수도 있다. 따라서 자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다.
  • 프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어 들여 재사용하기 위해 변수라는 메커니즘을 제공한다. 변수의 정의를 내려보면 다음과 같다.
  • 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.

식별자 identifier

  • 변수 이름을 식별자 라고도 한다. 식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다.
  • 식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺으며, 이 매핑 정보도 메모리에 저장되어야 한다.이처럼 식별자는 값이 아니라 메모리 주소를 기억하고 있다. 즉, ****식별자는 메모리 주소에 붙인 이름이라고 할 수 있다.
  • 변수, 함수, 클래스 등의 이름과 같은 식별자는 네이밍 규칙을 준수해야 하며, 선언(declaration) 에 의해 자바스크립트 엔진에 식별자의 존재를 알린다.

변수 선언

  • 변수 선언(variable declaration) 이란 변수를 생성하는 것을 말한다. 값을 저장하기위한 메모리 공간을 확보 (allocate) 하고 변수 이름과 확보된 메모리 공간의 주소를 연결(name binding) 해서 값을 저장할 수 있게 준비하는 것이다. 변수 이름과 확보된 메모리 공간은 확보가 해제(release)되기 전까지는 누구도 확보된 메모리 공간을 사용할 수 없도록 보호되므로 안전하게 사용할 수 있다.
    var score;
  • 변수를 선언한 이후, 아직 변수에 값을 할당하지 않았다. 따라서 변수 선언에 의해 확보된 메모리 공간은 비어 있을 것으로 생각할 수 있으나 확보된 메모리 공간에는 자바스크립트 엔진에 의해 undefined 라는 값이 암묵적으로 할당되어 초기화된다. 이것은 자바스크립트의 독특한 특징이다.
  • 초기화(initialization)란 변수가 선언된 이후 최초로 값을 할당하는 것을 말한다.
    만약 초기화 단계를 거치지 않으면 이전에 다른 앱이 사용했던 값이 남아 있을 수 있다. 이러한 값을 쓰레기 값(garbage value)이라 한다. 따라서 메모리 공간을 확보한 다음. 값을 할당하지 않은 상태에서 곧바로 변수 값을 참조하면 쓰레기 값이 나올 수 있다. 자바스크립트의 var 키워드는 암묵적으로 초기화를 수행하므로 이러한 위험으로부터 안전하다.

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

  • console.log(score); // undefined
    var score; // 변수 선언문
    변수 선언문보다 변수를 참조하는 코드가 앞에 있다. 런타임 순서대로라면 참조에러가 발생할 것처럼 보이지만, 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문(변수 선언문, 함수 선언문 등)을 소스코드에서 찾아내 먼저 실행한다. 이처럼 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅(variable hoisting)이라 한다.
  • 사실 변수 선언뿐 아니라 var, let, const, function, function*, class 키워드를 사용해서 선언하는 모든 식별자(변수, 함수, 클래스 등)는 호이스팅된다. 모든 선언문은 런타임 이전 단계에서 먼저 실행되기 때문이다.
profile
프론트엔드 개발자

0개의 댓글