Watnu 2024. 4. 24. 16:18

 

 

요약

모던 자바스크립트 Deep Deive : 4장 변수

 


 


 

변수 (Variable)

하나의 값을 저장하기 위해 메모리에서 확보(allocate)한 공간

아래의 코드처럼 10+20을 계산한다고 할때 10과 20은 각 메모리셀로 저장됩니다.

(메모리를 구성하는 메모리 셀은 1byte의 크기로 2진수로 저장됨)

10 + 20;

 

CPU는 10과 20의 메모리 주소를 읽은 후, + 연산을 하여 30 의 값을 도출해내고 그 값을 임의의 메모리 주소에 저장하게 됩니다. 30의 값을 사용할때는 메모리 주소인 0x0669F913에 접근하면 된다

But!  자바스크립트는 메모리 주소를 통해 값에 접근하는 기능을 제공 안해준다 

=> 메모리 주소에 접근하는 것은 치명적 오류를 발생시킬 수 있다. 그래서 우리는 필요합니다.

 




 

식별자 (Identifier)

어떤값을 구별해서 식별할 수 있는 고유한 이름을 말한다.

자바스크립트가 메모리 주소에 바로 접근을 못하므로 식별자를 이용해서

값이 아닌 메모리 주소를 기억해서 접근할 수 있게 해준다

( identifier(식별자) == 변수 )

let number = 10 + 20;

 


 
 

변수 선언

개념 내용

변수 선언이란, 변수를 생성하는것을 말한다.

아래의 코드처럼 변수를 선언하고 해당 변수에 아무런 값을 할당하지 않았다면

자바스크립트에서는 자동으로 `undefined` 값으로 초기화 과정이 일어나게 됩니다.

let result;

 

변수에 값을 할당에 선언하게 된다면 아래와 같은 모양이 됩니다.

let result = 50;

 


 
 

호이스팅

개념 내용

변수&함수 선언만 해당 스코프의 최상단으로 끌어올려지는 걸 호이스팅이라고 한다.

자바스크립트는 변수 선언부터 할당까지 3단계로 진행이 된다.

console.log(score); // A = undefined
var score = 60; 
console.log(score); // B = 60

위의 코드에서 A는 `undefined` B는 `60`을 출력합니다.

변수의 선언만 끌어올려지므로 값을 할당해도 A의 결과는  `undefined` 가 된다 

자바스크립트는 코드를 실행하기 전에 실행 컨텍스트에 등록된 변수 객체에 접근할 수 있다.

 

var변수 선언&초기화가 함께 진행되므로 호이스팅시 변수 접근이 가능하다.

let선언과 초기화를 각각 진행하므로 호이스팅시 변수에 접근이 불가능하므로 ReferenceError 가 발생한다.

(참조할 메모리가 없는 것이지 호이스팅이 발생하지 않는다는건 아니다)

 

+

event();  // A

function event(){
	let hoisting = 'Hoisting!!';
	console.log(hoisting);
}

event();  // B

호이스팅의 개념으로 볼때 함수 A는 실행되지 않아야 한다.

But!  자바스크립트는 함수를 호이스팅하기 때문에 A코드 B코드 모두 정상적으로 작동합니다.

 


 

 
 

값의 할당

개념 내용

var score; //변수 선언
score = 80; //변수 할당

처음 score가 선언되고 `undefined`가 초기값으로 자동 할당된다. 이후 80으로 값이 할당되고 score 값은 80이 된다.

 

자바스크립트는 이전 값이 저장되있던 메모리 공간을 지우고 재할당하지 않고 새로운 곳에 재할당 합니다.

그리고 이런 쓰레기 값(0x000000F2)은 가비지 콜렉터에 의해서 자동으로 해제가 됩니다.

* 한번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다.

 

가비지 콜렉터(GC)

- 자동 메모리 관리 형식: 가비지 컬렉터의 목적은 메모리 할당을 모니터링하고 할당된 메모리의 블록이 더 이상 필요하지 않은 시점을 확인하여 회수하는 것

- 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수를 참조 카운트 라고 하는데,
참조 카운트가 0인 메모리 주소는 가비지 컬렉터의 수거 대상이 되고,
가비지 컬렉터는 런타임 환경에 따라 특정 시점이나 메모리 사용량이 포화 상태에 임박할 때마다 자동으로 수거 대상들을 수거한다.

 

왜 이전 값이 저장되어있는 메모리를 사용하지 않고 새로운 값으로 할당을 할까요?


  자바스크립트는 

1) 유저에게 편의성을 제공하는 것이 목표이며 

2) 메모리를 효율적으로 관리하기 위해서 새로운 메모리를 할당하여 값을 저장합니다.


  프로그래밍 언어는 메모리 관리 방식에 따라 unmanaged 언어와 managed 언어로 분류 할 수 있습니다. 자바스크립트는 managed 언어로 메모리 관리를 자바스크립트 엔진이 맡아서 관리합니다.


  자바스크립트가 managed 언어를 체택한 이유는 유저에게 편의성을 제공하기 위해서 입니다. 자바스크립트의 탄생 배경은 웹사이트를 동적으로 바꾸고 싶어서 만들어진 가벼운 언어입니다. 그렇기 때문에 개발자에게 편의성을 제공하는 것에 초점을 맞추어 개발이 되었습니다.


  또 다른 이유는 **메모리를 효율적으로 관리하기 위해서** 입니다. 자바스크립트는 동적인 언어로 변수가 기리키는 값이 가변적으로 변할 수 있습니다. 그렇기 때문에 자바스크립트 엔진은 메모리를 몇 바이트 할당 해야하는지 알 수 없습니다.