프론트엔드 개발자의 기록 공간

[JavaScript DeepDive] 4~6장 본문

모던 자바스크립트 Deep Dive

[JavaScript DeepDive] 4~6장

[리우] 2022. 1. 24. 02:54

📖 학습 목차

  • 04장_변수
  • 05장_표현식과 문 (넘어감)
  • 06장_데이터 타입

 

✅ 변수

자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다. (매니지드 언어)

메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 높은 매우 위험한 일이다.

개발자의 실수로 사용하고 있는 값을 변경하면 시스템을 멈추게 하는 치명적인 오류가 발생할 수 있기 때문이다. 메모리 제어를 허용하더라도, 메모리 주소는 코드가 실행될 때 메모리의 상황에 따라 임의로 결정된다. 이는 동일한 컴퓨터에서 동일한 코드로 실행하더라도 동일한 메모리 주소는 아니기 때문에 의미가 없다.

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

변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.

 

즉, 변수는 값의 위치를 가리키는 상징적인 이름이다.

 

✍ 변수 선언과 값의 할당

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

 

var score; // 변수 선언 예시

자바스크립트 엔진이 var라는 키워드를 만나면 변수 이름을 등록하고 값을 저장할 메모리 공간을 확보한다.

위의 예시는 변수를 선언한 이후, 변수에 값을 할당하지 않았다. 그래서 비어 있을 것이라고 생각하지만,

자바스크립트 엔진에 의해 "undefined"라는 값이 암묵적으로 할당되어 초기화된다.

이는 자바스크립트의 독특한 특징이다.

 

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

변수 선언과 값의 할당을 하나의 문으로 단축 표현해도 변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다.

이때 주의할 점은 변수 선언과 값의 실행 시점이 다르다는 것이다.

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

 

function test() {
    console.log(score); // undefined
    
    var score; // 변수 선언
    score = 80; // 값의 할당
    (var score = 80 동일)
    
    console.log(score); // 80
}

변수 선언은 런타임 이전에 먼저 실행되고 값의 할당은 런타임에 실행된다.

런타임 시에 처음으로 만나는 console.log는 변수는 선언되어 있지만 할당이 안 되어 있기 때문에 undefined를 출력하고 그 후, score = 80을 만나 할당을 이루어지고, 출력을 하게 되면 80이 나오게 된다.

 

이러한 자바스크립트 특성을 "호이스팅"이라고 한다.

호이스팅에 대해 궁금하다면.... 정리해 놓은 여기를 참고 바란다.

 

✍ 값의 재할당

위의 예제에서 score를 선언하고 이후에 80을 할당하면 기존 메모리 주솟값에 80이 덮혀질 것이라고 생각하지만 그렇지 않다.! 새로운 메모리 주소에 80을 할당한다. 이때 참조 카운트(score가 가리키는) 곳 도 옮겨진 것을 알 수 있다. 그리고 또 90이라는 값을 재할당한다면 똑같이 메모리를 재할당하고 참조 카운트도 바뀐다.

그러면 undefined와 80의 메모리는 아무도 사용하지 않기 때문에 필요하지 않은 것이다.(참조 카운트가 없다) 이러한 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제된다.

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

 

✅ 데이터 타입

메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 한다.

자바스크립트 엔진은 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정된다.

ECMAScript 사양은 문자열과 숫자 타입 외의 데이터 타입의 크기를 명시적으로 규정하고 있지는 않다.

(숫자 타입은 배정밀도 64비트 부동소수점 형식 사용(8바이트), 문자열(2바이트))

그래서 문자열과 숫자 타입을 제외하고 데이터 타입에 따라 확보되는 메모리 공간의 크기는 자바스크립트 엔진 제소사의 구현에 따라 다를 수 있다.

 

즉 데이터 타입의 필요성은 다음과 같다.

  • 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
  • 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
  • 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해

 

✍ 동적 타이핑 - 동적 타입 언어와 정적 타입 언어

C나 자바 같은 정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류 즉, 데이터 타입을 사전에 선언해야 한다. 이를 명시적 타입 선언이라 한다. 이는 컴파일 시점에 타입 체크를 통해 오류를 체크한다.

 

자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론) 된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑이라고 하며, 동적 타입 언어라고 한다. 동적 타입 언어는 유연성은 높지만 신뢰성은 떨어진다.

 

728x90

'모던 자바스크립트 Deep Dive' 카테고리의 다른 글

[JavaScript DeepDive] 13~15장  (0) 2022.02.10
[JavaScript DeepDive] 12장_함수  (0) 2022.02.09
[JavaScript DeepDive] 10~11장  (0) 2022.01.27
[JavaScript DeepDive] 7~9장  (0) 2022.01.25
[JavaScript DeepDive] 1~3장  (0) 2022.01.20
Comments