TIL

190501_TIL(변수)

변수

1. 변수란 무엇인가? 왜 필요한가?

변수

  • 하나의 값을 저장할 수 있는 메모리 공간에 붙인 이름 또는 메모리 공간 자체를 말한다.

  • 메모리 주소를 직접 다루지 않아도 값을 저장하거나 참조할 수 있다

  • 재사용할 수 있도록 메모리 공간을 식별할 수 있는 이름을 붙인 것
  • 변수명을 통해 컴퓨터에게 참조를 요청하면 컴퓨터는 변수명과 매핑된 메모리 주소를 통해 메모리 공간에 접근하여 저장된 값을 반환해 준다.
  • 변수에 값을 저장하는 것을 할당(assignment 대입, 저장)이라 하고, 변수에 저장된 값을 읽어 들이는 것을 참조(reference)라고 한다.
  • 변수는 사람의 언어로 기술한 변수명을 통해 저장된 값의 의미를 명확히 할 수 있다. –> 가독성을 높여준다.

  • 질문사항

    • 메모리 주소로 메모리에 직접 접근하는 것이 위험한 일이지만 재사용은 가능한 것 아닌가?
    • 그렇다면 변수는 개발자가 직접적으로 메모리를 제어하는 것이 위험하기 때문에 간접적인 제어가 가능하도록 고안된 것인가???

식별자

  • 변수명을 식별자라고도 부른다.
  • 어떤 값을 구별하여 식별해낼 수 있는 고유한 이름을 말한다.
  • 식별자라는 용어는 변수에만 국한해서 사용하지 않는다. 예를 들어, 변수, 함수, 클래스 등의 이름은 값을 구별할 수 있는 이름이므로 모두 식별자다. 따라서 식별자는 변수명보다는 상위 개념이다.


2. 변수 선언

변수 선언 이란?

  • 변수 선언(Variable declaration)이란 변수명(식별자)을 등록하여 자바스크립트 엔진에 변수의 존재를 알려 관리하도록 하는 것을 말한다
  • 변수를 선언할 때는 var, let, const 키워드를 사용한다.
  • let, const 키워드가 도입되기 이전까지 변수를 선언할 수 있는 유일한 키워드인 var은 블록 레벨 스코프(Block-level scope)를 지원하지 않는 점, 중복 선언을 허용하는 점, var 키워드 없이 변수 선언이 가능하다는 단점이 있다.
  • 변수의 값을 할당하지 않으면 메모리 공간이 비어있는 것이 아니라 자바스크립트 엔진에 의해 undefined(원시타입의 값)라는 값이 암묵적으로 할당되어 초기화된다.

자바스크립트 엔진의 변수 선언 2단계

  1. 선언 단계(Declaration phase)

    • 변수명을 등록하여 자바스크립트 엔진에 변수의 존재를 알린다.
  1. 초기화 단계(Initialization phase)

    • 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당한다.


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

변수 선언의 실행 시점

  • 변수 선언은 소스 코드가 순차적으로 한줄씩 실행되는 시점(런타임, run-time)이 아니라 그 이전(파싱 타임, parsing-time)에 먼저 실행된다
  • 자바스크립트 엔진은 소스 코드를 한줄씩 순차적으로 실행하기 이전에 먼저 소스 코드 전체를 평가한다. 이때 모든 선언문(변수 선언문, 함수 선언문 등)을 찾아내어 식별자를 등록하고 초기화한다. 그후, 선언문을 제외한 소스 코드를 한줄씩 순차적으로 실행한다.

변수 호이스팅(Variable Hoisting)

  • 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징
  • 호이스팅은 변수 선언 뿐만이 아니라 var, let, const, function, function*, class 키워드를 사용한 모든 선언문에 적용된다.
  • 질문사항

    • let , const 키워드를 사용하여 변수를 선언하면 마치 호이스팅이 되지 않은 것처럼 ReferenceError(참조에러)가 발생하는데 왜 그런 것인지?????


4. 값의 할당

  • 변수에 값을 할당(assignment 대입, 저장)할 때는 할당 연산자(=)를 사용한다.
  • 변수 선언은 다른 코드가 실행되기 이전, 즉 파싱 타임에 먼저 실행되지만 값의 할당은 코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
  • 따라서, 변수의 호이스팅이 일어나도 값이 할당된 상태가 아닌 선언된 상태로 호이스팅된다.
  • 변수에 값을 할당할 때는 이전 값 undefined가 저장되어 있던 메모리 공간을 지우고 그 메모리 공간에 할당 값을 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그 메모리 공간에 할당 값을 저장하는 것에 주의하자.


5. 값의 재할당

  • 현재 변수가 저장하고 있는 값을 버리고 새로운 값을 저장하는 것
  • 처음 값을 할당했을 때와 마찬가지로 새로운 메모리 공간을 확보하고 그 메모리 공간에 값을 저장
  • 변수에 값이 새롭게 재할당되면 이전에 할당된 값은 어떤 변수도 값으로 갖고 있지 않은 불필요한 값이 된라. 이러한 값은 가비지 컬렉터(Garbage Collector)에 의해 메모리에서 자동 해제된다.
  • 자바스크립트와 같은 매니지드 언어는 메모리의 할당 및 해제를 위한 메모리 관리 기능을 언어 차원에서 담당하고 개발자의 직접적인 메모리 제어를 허용하지 않는다.

참고자료

poiemaweb

Share