프론트엔드

4. 변수 / 5. 표현식과 문

카엔입니다 2022. 5. 17. 20:28

변수는 데이터를 관리하기 위한 핵심 개념

10 + 20

// 결과값
30

컴퓨터는 위 표현식을 cpu를 사용해 연산하고 메모리를 사용해 데이터를 기억한다

메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체이며 셀 하나의 크기는 1바이트(8비트)이다

컴퓨터는 메모리 셀의 크기 단위로 데이터를 저장하거나 읽어낸다

각 셀은 고유한 메모리 주소를 갖는데 메모리 공간의 위치를 나타내며 0부터 시작해서 메모리의 크기만큼 정수로 표현된다

컴퓨터는 모든 데이터를 2진수로 처리한다

이러한 연산에 문제점으로는 연산된 결과 값을 재사용할 수 없다는 것이다

연산된 값을 재사용하려면 메모리 주소에 직접 접근해야하는데 이러한 접근은 치명적인 오류를 발생시킬 가능성이 매우 높다

만약 실수로 운영체제가 사용하고 있는 값을 변경한다면 시스템이 멈춰버릴 수도 있기 때문이다 그래서 자바스크립트는 개발자가 직접적인 메모리 제어를 허용하지 않는다

그래서 자바스크립트는 기억하고 싶은 값을 메모리에 저장하고 저장된 값을 읽어들여 재사용하기 위해 변수를 사용한다

즉 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체이며 메모리 공간을 식별하기 위해 붙인 이름을 뜻한다(값의 위치를 가리키는 상징적인 이름)

이러한 변수를 사용해서 직접 메모리 주소를 통할 필요가 없이 값에 안전하게 접근할 수 있다

변수 이름(저장된 메모리 공간에 붙인 상징적인 이름)이며 식별자 중 하나이다

변수에 값을 저장하는 것을 할당(대입, 저장)

변수에 저장된 값을 읽어들이는 것을 참조라 한다

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

식별자는 값이 아니라 메모리 주소를 기억하고 있다

변수, 함수, 클래스 등등 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름은 모두 식별자라고 한다

변수 선언

변수를 생성하는 것을 말함

즉 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것

변수 선언에 의해 확보된 메모리 공간은 확보가 해제되기 전까지는 누구도 확보된 메모리 공간을 사용할 수 없도록 보호되므로 안전하게 사용할 수 있다

var, let, const 세개의 키워드를 통해 선언할 수 있다

키워드는 자바스크립트 엔진이 수행할 동작을 규정한 일종의 명령어임

키워드는 자신이 수행해야 할 약속된 동작을 실행함

변수 선언에 의해 확보된 메모리 공간은 undefined 값이 암묵적으로 할당되어 초기화된다

변수 선언은 2단계에 걸쳐 수행된다

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

모든 식별자는 실행 컨텍스트에 등록된다

자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다

실행컨텍스트를 통해 식별자와 스코프를 관리한다

변수 이름과 변수 값은 키, 값 형식인 객체로 관리된다

초기화 단계를 거치지 않으면 남아있던 값(garbage value)이 참조될 수 있기에 초기화를 꼭 시켜줘야한다

변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다

console.log(test); // undefined

var test; // 1. 변수 선언
test = 10; // 2. 값 할당

console.log(test); // 10

값을 재할당할 수 없다면 변수가 아닌 상수라 칭한다

재할당한 값은 기존 메모리 공간에 있던 값을 지우고 새로운 값으로 다시 할당해주는 것이 아니라 새로운 메모리 공간을 확보하고 그 메모리 공간에 값을 저장한다

그럼 남게되는 garbage value는 어떻게되냐?

가비지 콜렉터가 주기적으로 메모리 공간을 검사해서 사용되지 않는 메모리를 해제해버린다 이런식으로 메모리 누수를 방지하게 된다

단 언제 메모리가 해제될지는 예측할 수 없다

자바스크립트는 매니지드 언어로써 메모리 할당 및 해제와 같은 메모리 관리기능을 언어 차원에서 담당하고 개발자는 접근할 수 없다

그래서 일정한 생산성을 확보할 수 있지만 성능 면에서 손실은 감수할 수 밖에 없다

반면 c언어 같은 경우는 언매니지드 언어로써 반대의 개념을 가지고 있다

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

예약어는 프로그래밍 언어에서 사용되고 있거나 사용될 에정인 단어를 말한다

값은 표현식이 평가(식을 해석해서 값을 생성하거나 참조하는 것)되어 생성된 결과를 말한다

10 + 20 = 30;

리터럴

사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법

// 숫자 리터럴 3
3

숫자 리터럴 3은 사람이 이해할 수 있는 숫자인 3을 자바스크립트 엔진은 이를 평가해 숫자 값 3을 생성하는 것

표현식과 문의 차이