[코어자바스크립트] 메모리와 데이터 && 식별자와 변수
📚 What is TIL?
컴퓨터는 전기 신호의 on/off 상태로 정보를 표현하기 때문에
이진법을 이용하여 전선 한가닥으로 모든 수체계를 표현하는 방법을 선택했다
🔎 전류가 흐른다면 1 흐르지 않는다면 0
🔎 이진법은 컴퓨터가 정보를 처리하는 가장 작은 단위로 binary digit이다
binary digit 즉 Bit란?
컴퓨터는 0과 1로 모든 데이터를 표현한다
0과 1만 표현할 수 있는 하나의 메모리 조각을 bit라고 한다
데이터를 저장하는 가장 작은 단위이다
💡 그렇다면 데이터를 저장하기 위해서는?
🔎 변수를 사용해서 데이터를 저장하는 것이 가능하다
🔎 데이터를 저장하기 위해서 변수를 사용해서 저장하는데
🔎 여기서 변수는 데이터 값을 저장하는 컨테이너이다
⚠️ 하지만 변수로 데이터를 저장하는 것은 컴퓨터의 메모리 용량에 따라 저장할 수 있는 데이터의 양이 제한적이다
⚠️ 변수로 데이터를 저장하는 것은 데이터를 유지하기에 한계가 있다 프로그램을 종료하면
변수에 저장된 데이터도 함께 사라지기때문이다
변수에 저장된 데이터는 컴퓨터의 주 메모리(RAM)에 저장되어 있는데 주 메모리는(RAM)는 휘발성 메모리이다
따라서 데이터를 영구적으로 저장하기 위해서는 file(텍스트 파일, 이미지/동영상 파일)이나
Database(MySQL, Oracle)와 같은 데이터 저장소를 사용해야한다
메모리
a 라는 식별자(변수명)로 변수를 선언하면
해당 변수의 값(1)을 저장하기 위한 메모리 공간이 할당되고 메모리는 비트로 구성되어 있는데
식별자(변수명)와 값은 각각 다른 메모리 공간에 저장된다
변수값이 저장되어 있는 메모리 공간을 가리키는 메모리 주소도 같이 저장이된다
let a = 1;
🔎 즉, 식별자(변수명)은 변수가 저장된 메모리 공간의 주소를 가리키는 역할로 변수의 값이
저장된 메모리 공간을 가리키는 것이다
🔎 따라서 식별자(변수명)를 통해서 가리키고 있는 값을 변경할 수 있다
왜 선언과 할당을 나눈 것일까?
새로운 값이 현재 할당된 변수보다 더 많은 메모리가 필요한 경우
새로운 값을 수용하기 위해 더 많은 메모리를 확보해야 할 수도 있다
따라서 변수이름이 저장되어있는 메모리에 값을 바로 할당하지않고
저장하려는 데이터 유형에따라 이를 보관할 적절한 양의 메모리로 할당되도록 설계되었다
var x = 10;
var y = "hello";
x = y;
⚠️ 만약 이러한 설계가 없다면 새로운 값이 이전에 저장된 데이터를 덮어쓰고 메모리 손상 또는 데이터 손실을 일으킬 수 있다
🔎 따라서 변수의 이름이 저장되어있는 메모리에 값을 바로 할당하지 않고 저장하려는 데이터에 따라 새로 공간을 마련하고
그곳의 주소를 변수의 이름이 저장되어있는 메모리에 할당하는 것이다
Byte
서로 같은 크기를 가진 창고와 창고를 열어들일 수 있는 열쇠를 생각해보자
그런데 만약, 모든 창고가 물건을 몇개 넣을 수 없는 크기를 가지고 있다면 창고에 보관 할 수 있는 물건의 수가
한정적이기 때문에 공간이 차게 되면 불필요하게 창고를 많이 사용해야한다
그렇게되면, 원하는 물건을 찾기위해 일일이 창고를 열어봐야하는 상황이 벌어질 수 있다
🔎 이와 마찬가지로 데이터를 효율적으로 검색하고 사용하기 위해 데이터의 단위 즉, Byte와 같은 단위들이 생겨났다
예를 들어, 1,000개의 비트 데이터를 저장해야 한다면,
비트 단위로 저장하기 위해선 1,000개의 메모리 공간이 필요하다
하지만, 바이트 단위로 저장하면 125바이트에 저장할 수 있다.
즉, byte를 사용하면 메모리를 할당하고 접근하는데에 있어서 더 효율적이다
데이터의 유형과 메모리 공간의 관련성
자바스크립트에는 number, string, boolean, null, and undefined 등 여러 가지 기본 데이터 유형이 있다
데이터 유형은 데이터가 메모리에 저장되는 방식을 결정한다
데이터 유형에 따라 메모리 공간에서 확보할 공간의 크기는 제각각이다
💡 정수나 부동 소수점 같은 큰 데이터 유형은 값을 저장하는 데 많은 비트가 필요하고 boolean 데이터 유형의 경우
참 또는 거짓 값만 나타낼 수 있고 값을 저장하는데 1bit 메모리만 필요하니 딱 그정도의 크기만 확보할까?
🔎 아니다 낭비되는 공간이 있더라도 적정하게 byte 단위로 묶으면 표현할 수 있는 값도 늘어나고 검색시간도 줄일 수 있다
🔎 예를 들어, 숫자 데이터 타입은 8바이트의 메모리가 필요하고 문자열 데이터 타입은 한글 2바이트, 영문 1바이트가 필요하다
다른언어의 경우엔?
C나 C++ 와 같은 언어는 변수의 데이터 타입과 크기를 미리 지정한다
변수가 선언될 때 필요한 메모리 공간을 미리 할당하고, 값을 저장할 때는 해당 메모리 공간에 직접 값을 저장한다
즉, 변수의 크기나 데이터 타입을 변경하려면 새로운 메모리 공간을 할당하고, 기존의 값은 복사해야 한다
Python
a = 10 # 변수 a에 정수형 값 10을 할당한다
print(a) # 변수 a의 값을 출력한다
🔎 Python에서는 변수의 데이터 타입이 자동으로 결정된다
🔎 따라서, 변수의 선언 과정이 간단하다 변수 a를 선언할 필요없이, 변수에 값을 할당하면 된다
C
#include <stdio.h>
int main() {
int a;
a = 10;
printf("%d\n", a);
return 0;
}
🔎 위 코드에서 변수 a는 int(정수형) 데이터 타입을 가지고 있으며, 변수 a를 선언할 때 메모리 공간을 할당한다.
🔎 이후 변수 a에 값을 할당할 때는 해당 메모리 공간에 직접 값을 저장하게 된다.
💡 언어마다 값이 저장되는 방식이나 변수의 선언 방식, 메모리 관리 방식 등이 다르다는 것을 인지하자
자바스크립트와 C언어의 차이점
자바스크립트에서 변수에 원시값을 저장하는 경우에는
C 언어와 동일하게 해당 변수에 직접 원시값이 저장되는 공통점이 있다
⚠️ 반면, 변수가 객체나 배열을 저장하는 경우에는 객체나 배열의 값을 저장한 메모리 공간의 주소를 변수에 할당한다
⚠️ 즉, 자바스크립트는 변수의 값이 메모리 공간에 직접 저장되는 것이 아니다
💡 그렇다면, 자바스크립트에서 객체나 배열을 C언어와 같이 직접할당하는 경우 어떤 일이 있을까?
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr2.push(4);
console.log(arr1);
console.log(arr2);
arr1과 arr2는 모두 원소 1,2,3 이 들어있는 배열을 참조하게 된다
push를 통해 arr2 에 원소4를 추가하면, arr2 에 대한 변경 사항이 원래 배열
arr1 에 영향을 미치는 것을 볼 수 있다
변수가 가리키고 있는 메모리 공간에 직접 변경된 값이 저장되므로,
이것은 다른 변수에서도 변경된 값을 참조했기 때문에 발생하는 문제이다
🔎 따라서, 자바스크립트는 항상 참조를 통해 변수에 할당하는 것이 좋다.
댓글남기기