모던 자바스크립트 Deep Dive - 4장

박상은·2021년 9월 28일
0

정리

1. 변수

모든 애플리케이션은 복잡해보여도 결국 데이터를 받아서 새로운 데이터를 도출하는 역할을 합니다.
그리고 그 데이터를 처리하는데 필요한 것이 변수입니다.

const sum = 10 + 20;

// 위의 식을 자바스크립트가 만났을 때 해석하기위해 필요한 것
// 1. 10, 20이라는 리터럴에 대한 의미
// 2. + 연산자에 대한 의미

// 연산은 CPU
// 데이터저장은 memory

// 위의 식을 자바스크립트가 만났을 때 해석하는 방법
// 1. 10과 20인 숫자리터럴을 메모리의 임의의 공간에 2진수 형태로 저장한다. ( 이때 저장된 메모리주소를 기억해둔다 )
// 2. CPU에서 메모리주소를 읽어서 연산결과를 만들어내고 연산결과를 임의의 메모리공간에 2진수 형태로 저장한다.
// 3. 이때 30이 저장된 메모리공간을 반환해줘서 sum이라는 변수에 이진수형태로 30이 저장된 메모리공간의 주소가 저장된다.

이때 sum을 변수라고 부르며, 변수란 하나의 값을 저장하기 위해 확보한 메모리 공간 자체를 의미한다.
간단하게 말하면 값을 가리키는 위치값을 상징적으로 부르는 이름

JavaScript에서는 CC++의 포인터처럼 메모리공간에 직접 접근할 수 있는 방법이 없습니다.

  • 할당: 변수에 값을 저장하는 행위 ( 대입 or 저장이라고도 부름 )
  • 참조: 변수에 저장된 값을 읽는 행위
  • 식별자: 어떤 값을 구분해서 식별할 수 있는 이름을 의미 ( 변수명, 함수명, 클래스명 등 )

2. 변수 선언

변수 선언이란 값을 저장하기 위한 메모리공간을 확보하고, 변수 이름과 메모리공간을 맵핑하는 행위를 의미한다.
변수 선언에 의해서 확보된 메모리공간은 변수가 해제되기 전까지 누구도 그 공간을 사용할 수 없도록 보호된다.

변수선언에는 var, let, const등을 사용한다.

2.1 변수 선언 단계

  1. 변수선언단계: 변수이름을 등록해서 자바스크립트 엔진에서 존재를 알림
  2. 변수초기화단계: 변수에 초기값을 undefined로 넣어줌

2.2 값의 할당

변수에 값을 할당하는 단계

3. 코드해석

자바스크립트는 코드를 해석할 때 코드평가단계런타임이 나눠져있다.

  • 코드평가단계: 코드가 유효한 코드인지 확인하는 단계, 호이스팅이 일어남
  • 런타임: 코드를 한줄씩 실행하는 단계

변수에 새로운 값을 넣을 때는 같은 메모리공간에 값을 지우고 새로운 값을 넣는 것이 아니고,
새로운 메모리공간에 값을 넣고 메모리의 주소를 변경시킨다.
즉, 아래의 예시에서 처음 v와 마지막 v는 다른 메모리공간을 가리킨다.

console.log(v);	// undefined

var v;	// 변수 선언 ( 코드평가단계에서 실행... 호이스팅 )
v = 10;	// 값의 할당 ( 런타임에서 실행 )

console.log(v);	// 10

4. 변수 재할당과 가비지콜렉터

변수 재할당이란 변수에 값을 변경하는 행위를 말한다.

var v = 10;	// 변수 선언과 변수 초기화
v = 20;		// 변수 재할당

위 예시에서 일어나는 일
1. 메모리공간을 undefined로 초기화하고 해당 메모리주소를 v에 넣는다.
2. 새로운 메모리공간을 10으로 초기화하고 해당 메모리주소를 v에 넣는다.
3. 새로운 메모리공간을 20으로 초기화하고 해당 메모리주소를 v에 넣는다.

그러면 결과적으로 undefined와 10이 들어가 있는 메모리공간이 생겨서 메모리낭비가 발생하는데
이를 해결하기위해 자바스크립트의 가비지콜렉터가 참조되지않는 메모리공간의 할당을 해제한다.

5. 변수 네이밍 규칙

  1. 문자, 숫자, _, $제외한 문자는 사용금지
  2. 맨 처음 식별자는 숫자 금지
  3. 예약어 금지
  4. camelCase, snake_case, PascalCase중 하나의 규칙만 적용하기 ( 대부분 PascalCase 사용 )

추가

  • 변수이름은 실행컨텍스트에 저장된다.

마무리

  • const v = 10;이면 v에 10이 들어있는 것이 아니고, v는 10이 2진수형태로 들어가 있는 메모리의 주소값을 가지고 이를 변수라고 부른다.

  • 가비지콜렉터에서 참조되지않는 메모리공간이란 접근할 수 있는 식별자가 없는 값을 의미합니다.

0개의 댓글