본문 바로가기

Web/javascript

javascript - javascript의 메모리와 데이터할당 (데이터 할당의 자유와 효율성)

1. 메모리와 데이터

javascrip의 메모리와 데이터 그리고 데이터할당에 대해서 알아보도록 하겠습니다. 본 포스팅은 코어자바스크립트라는 책을 기반으로 작성되었습니다.

 

 

 

1. 메모리와 데이터

1.1 데이터 단위 존재의 이유

컴퓨터는 01로 모든 데이터를 표현합니다. 이렇게 0과 1만 표현할 수 있는 하나의 메모리 조각을 bit라고 표현합니다. 그런데 Byte와 같은 단위들은 왜 생겨났을까요??

 

화폐

간단합니다. 우리 일상생활에서도 찾아볼 수 있는데요 바로 화폐입니다. 10원짜리 동전으로도 100만원 1000만원을 표현할 수 있지만, 이는 매우 비효율적입니다.

 

예를들어 카드가 없던시절 매우 비싼 명품을 산다고 했을때, 이를 10원짜리 동전으로 계산하고 거스름돈을 받는다고 생각을 해보면, 시간이 매우 많이 소요되는 작업일것임이 예측될것입니다. 때문에, 우리는 이를 더 쉽게 계산하고 운반할 수 있도록 더 높은 단위의 화폐들(10000, 50000원) 을 가지고 있습니다.

 

 

데이터의 단위

화폐와 마찬가지로 데이터의 단위 역시 데이터를 효율적으로 검색하고 사용하기 위해 생겨났습니다.

 

컴퓨터는 어떤 메모리조각(우선은 bit)에 접근하기 위해 각 bit에 고유식별자를 부여하고, 그 식별자를 통해 메모리조각에 접근하여 원하는 데이터를 가져오게 됩니다. 하지만 0과 1만 표현할 수 있는 하나의 단위로 데이터를 검색하고 가져오는것은 매우 비효율적일 것입니다. 따라서 Byte(8bit)와 같은 단위가 생겨나게 되었습니다.

 

 

 

 

2. Javascript의 데이터할당

2.1 데이터 할당과정

메모리주소와 식별자 ?


var a; (또는 let, cosnt) 로 a라는 변수를 선언했을때, 메모리의 상황입니다. 위의 그림을 해석하자면, 1003이라는 메모리의 주소에 a라는 이름의 식별자를 부여하였다는 뜻 입니다. 따라서 우리는 a라는 이름을 이용하여 1003의 주소에 데이터를 넣고, 가져올 수 있습니다.

 

 

조금 특이한 데이터할당과정

위에서 보여지는 두가지 방식 모두 같은 결과를 발생시키게 됍니다. 음 앞서서 보여드린 그림을 토대로 위의 과정을 진행한다면, 임의의 주소값 1003식별자 a를 부여하고, 값에 'abc'를 넣으면 되지 않을까요??

 

하지만 javascript는 a라는 이름의 주소에 데이터를 직접 저장하지 않습니다. abc라는 값을 저장할 새로운 공간을 찾아 저장을 한뒤, 해당 주소값을 a의 값에 저장하게 됩니다.

 


  1. 변수영역에서 빈공간 1003을 확보하고, 이름(식별자)를 a로 지정.
  2. 데이터 영역에서 빈공간 5004를 확보하고 'abc'를 저장.
  3. 변수영역에서 a(@1003)라는 식별자를 검색하여, 해당 공간의 값에 앞서 저장된 'abc'의 주소인 @5004를 저장.

앞서 설명드렸듯이, javascript는 주소값에 식별자를 지정하고 바로 값을 할당하지 않고, 별도의 데이터 공간에 데이터를 저장하고, 그 값을 가리킬수 있는 주소값을 할당합니다. 왜이렇게 할까요??

 

 

 

데이터 변환의 자유와 효율적인 메모리 관리

앞선 질문에 대한 답은 위의 소제목이 될것 같습니다. 하나씩 살펴보시죠

 

데이터변환의 자유

javascript의 경우, java와는 다르게 var라는 키워드에 어떠한 형(number, boolean, string)의 데이터든지 마음대로 변환하며 대입할 수 있는 이유가 바로 앞서 설명드린 것과 같은 방식으로 데이터를 할당하기 때문입니다.

 

다시 한번 말씀드리자면, 각각의 데이터 즉 숫자자료형 문자자료형 등등은 그 데이터의 단위가 다르고 따라서 미리 확보하는 공간의 크기가 제각각입니다. 숫자형의 경우는 8byte를 확보하며, 문자열의 경우에는 한글자당 한글은 2byte 영어는 1byte이지만 전체글의 길이가 가변적이기 때문에 정해진 규격이 없습니다.

 

만약 변수영역에 바로 값을 대입 한다고 가정하고, 미리 잡아놓은 공간보다 큰 데이터가 새로 할당이 된다고 생각해보죠, 당연히 부족한 만큼의 공간을 늘리는 작업이 필요하게 되고, 이 주소공간이 어떤 데이터들의 사이에 존재한다면 해당 데이터의 뒤에 존재하는 모든 데이터를 뒤로 옮기고 식별자를 다시 연결하는 작업이 필요할 것입니다. 이 때문에 변수영역에서 값을 바로 할당하지 않고 저장하려는 데이터에 따라서, 데이터 영영에 새로히 공간을 잡고, 그곳의 주소를 변수영역에 할당하는 것입니다.

 

 

효율적인 메모리관리

이런식으로 변수영역과 데이터영역을 나누는 것은 반복적인 데이터를 저장할때에도 엄청난 이점을 가져옵니다. 예를들어 숫자 5를 500개의 변수에 할당하는 작업을 한다고 가정을 해보죠.

 

변수영역에 값을 바로 할당한다고 하면, 숫자형은 8byte를 사용한다고 했으니 8 * 500 즉 4000byte가 필요하게 됩니다.

 

하지만 변수영역과 데이터영역을 나눈다면, 주소공간의 크기를 2byte라고 했을때, 2 * 500 + 8 의 공간이 필요하게 됩니다. 데이터영역에 숫자 5를 담은 8byte 공간 1개와 이 곳의 주소를 가리키는 2byte의 변수영역의 공간 500개가 필요하기 때문이죠.