[JS] Deep Dive 4장 변수

그래도 해야지·2023년 5월 13일
0

JavaScript

목록 보기
4/11
post-thumbnail

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

사람은 계산과 기억을 모두 두뇌에서 하지만, 컴퓨터는 연산과 기억을 수행하는 부품이 나눠져있다.
컴퓨터는 CPU를 사용해 연산하고, 메모리를 사용해 데이터를 기억한다.

메모리

  • 데이터를 저장할 수 있는 메모리셀(1Byte)의 집합체
  • 각 셀은 메모리 주소를 갖고, 메모리 주소 = 메모리 공간의 위치
  • 10과 20은 메모리상의 임의의 위치(메모리 주소)에 기억(저장)되고, CPU는 이 값을 읽어들여 연산을 수행함

메모리 주소에 어떻게 접근할까?

  • 연산 결과 30이 저장된 메모리 공간에 직접 접근하는 것 외에는 방법이 없다.
  • 하지만 메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 높은 매우 위험한 일
  • 따라서 자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않음

하지만 허용을 하더라도 문제가 있음

  • 값이 저장될 메모리 주소는 코드가 실행될 때 메모리 상황따라 임의로 결정됨
  • 동일한 컴퓨터에서 동일한 코드를 실행해도 코드가 실행될 때마다 값이 저장됨
  • 메모리 주소는 변경됨
  • 이처럼 코드가 실행되기 이전엔 값이 저장된 메모리 주소를 알 수 없으며, 알려주지도 않는다.
  • 따라서 메모리 주소를 통해 값에 직접 접근하려는 시도는 올바르지 않다.

변수

프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어 들여 재사용하기위해 변수라는 메커니즘을 제공함

변수란?

  • 메모리 공간에 저장된 값을 다시 읽어들여 재사용할 수 있도록 값이 저장된 메모리 공간에 상징적인 이름을 붙인 것

따라서, 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요가 없고, 변수를 통해 안전하게 값에 접근할 수 있다.

변수 이름

  • 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름

변수 값

  • 변수에 저장된 값

할당(대입, 저장)

  • 변수에 값을 저장하는 것

참조

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

2. 식별자란?

  • 변수이름
  • 어떤 값을 구별해서 식별할 수 있는 고유한 이름
  • 메모리 주소에 붙인 이름
  • 식별자가 기억하고 있는 메모리 주소를 통해 메모리 공간에 저장된 값에 접근할 수 있다는 의미
  • 변수, 함수, 클래스 등의 이름은 모두 식별자

3. 변수 선언

변수 선언

  • 변수를 생성하는 것
  • 값을 저장하기 위한 메모리 공간을 확보하고, 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것
  • 변수를 사용하려면 반드시 선언이 필요함

var 키워드

특징

var를 사용한 변수 선언은 선언 단계와 초기화 단계가 동시에 진행됨

단점

블록 레벨 스코프를 지원하지 않고 함수 레벨 스코프를 지원함
그래서 의도치 않게 전역 변수가 선언되어 심각한 부작용이 발생하기도 함
이를 보완하기 위해 ES6에서 let과 const 키워드를 도입함

자바스크립트의 독특한 특징

변수를 선언만하고 값을 할당하진 않았을 때 메모리 공간은 비어있는 것이 아니라 자바스크립트 엔진에 의해 undefined라는 값이 암묵적으로 할당되어 초기화됨

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

  • 선언 단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알림
  • 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화함

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

console.log(score); // undefined

var score; // 변수 선언문

자바스크립트 엔진은 소스코드를 순차적으로 실행하기 전에 소스코드의 평가 과정을 거치면서 소스코드를 실행하기위한 준비를 함
소스코드의 평가 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내 먼저 실행함
그리고 소스코드의 평가 과정이 끝나면 모든 선언문을 제외한 소스코드를 한줄씩 순차적으로 실행함

자바스크립트 엔진은 변수 선언이 소스 코드의 어디에 있든 상관없이 다른 코드보다 먼저 실행함

변수 선언이 소스코드가 순차적으로 실행되는 런타임 이전 단계에서 먼저 실행됨
변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라고 함

5. 값의 할당

할당 연산자

할당 연산자는 우변의 값을 좌변의 변수에 할당함

변수 선언, 값의 할당은 각각 실행됨

자바스크립트 엔진은 변수 선언과 값의 할당을 하나의 문으로 단축 표현해도 변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행함

변수 선언과 값의 할당이 실행되는 시점

  • 변수 선언 : 런타임 이전에 먼저 실행
  • 값의 할당 : 런타임에 실행

새로운 메모리 공간을 확보하고 그곳에 할당 값 80을 저장

변수에 값을 할당할 땐 이전 값 undefined가 저장되어 있던 메모리 공간을 지우고 그 메모리 공간에 할당 값 80을 새롭게 저장하는 것이 아니라, 새로운 메모리 공간을 확보하고 그곳에 할당 값 80을 저장함

6. 값의 재할당

재할당이란?

  • 현재 변수에 저장된 값을 버리고 새로운 값을 저장하는 것

var

  • var로 선언한 변수는 재할당 가능
  • var로 선언한 변수는 선언과 동시에 undefined로 초기화되기 때문에 엄밀히 말하자면 변수에 처음으로 값을 할당하는 것도 사실은 재할당임

let

중복 선언 불가능, 재할당 가능

const

중복 선언 불가능, 재할당 불가능

상수

  • 한번 정해지면 변하지 않는 값

재할당 시 메모리

값을 재할당을 하면 원래 있던 메모리 공간에 새로운 값을 저장하는 것이 아니라, 새로운 메모리 공간에 새로운 값을 저장함

가비지 콜렉터

재할당을 하고 나서 그 이전에 값들은 더 이상 사용되지 않기 때문에 불필요한다.
가비지 콜렉터는 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능이다.

7. 식별자 네이밍 규칙

자바스크립트는 대소문자를 구분하므로 다음 변수는 각각 별개의 변수

  • var firstname
  • var firstName

0개의 댓글