자바스크립트를 공부하면서 메모리에 대한 생각을 깊게 해본 적이 없었다. 개발 공부를 시작하면서 처음 들었던 강의가 우리의 언어를 컴퓨터의 언어로 바꾸려면 어떻게 해야하는가에 대한 내용이었는데, 이때 2진수와 비트, 메모리 주소, 포인터
등의 개념을 학습했다. 대략적으로 이해는 했었지만 최종적으로 나에게 메모리는 네모박스들의 집합에 불과했다.
그리고 cs관련 서적을 읽으면서 빛의 속도는 일정하기 때문에 하드웨어적 한계가 존재하기때문에 메모리의 낭비를 최소화하고, 효율적으로 사용해야함을 알게되었다.
최근에는 자바 언어를 공부하면서 메모리를 좀 더 신경쓰게되었고, 자연스럽게 자바스크립트에서도 메모리 관련 이슈나 원리에 대해서 알아보게되었다. 그래서 제일 직관적인 데이터 타입을 정리하기 전에 메모리와 관련된 간단한 내용을 정리해보려한다.
데이터를 저장할 수 있는 메모리 셀의 집합체
각 셀은 고유의 메모리 주소를 갖는다.
정의를 쉽게 이해하기 위해서 네모 상자들의 집합이라고 표현했는데, 제 표현이 이해되실거라고 생각한다. 그리고 드는 의문점 각 셀은 메모리 주소를 가지는 데, 이 메모리 주소를 저장하는 공간이 또 존재하는 것인가?
메모리의 메모리?
💡 메모리 주소 자체는 일반적으로 메모리에 저장되지 않는다.
메모리 주소는 CPU와 메모리 컨트롤러가 연산하는 하드웨어적인 개념, 다만포인터 변수나 레지스터를 통해 주소를 가리키는 값
이 메모리에 저장될 수 있다.
역시 말이 안되는 구조였다. 이해 완료.
Started from the bottom
어제 프로젝트 팀원이었던 분께서 언급한 노래 제목인데, 개념을 이해하기 위해서는 가장 작은 것부터 접근하는 것
이 좋다고 생각한다. 정의에서 메모리는 메모리 셀들의 집합체라고 했으니, 그럼 메모리 셀, 즉 네모상자부터 접근해서 이해해야한다. 이 네모상자들은 하나하나가 데이터를 저장할 수 있는 가장 작은 단위이고, 비트bit
라는 기본 단위로 구성되어있다. 이러한 비트는 0 또는 1만 표현할 수 있는 최소 단위의 메모리 조각이다.
그런데 왜 비트를 가장 작은 단위로 사용할까? 사실 컴퓨터의 언어는 0,1로 이루어져있기 때문에 비트bit
로 표현할 수 있으니까라고 단순히 생각해왔다. cs 서적이나, 메모리에 대한 생각이 없었다면 지금까지도 그렇게만 생각하고 있었을 것 같다. 하지만 지금의 지식으로 다시 답을 해보자면 효율성
때문이다.
cs서적에서 나온 표현을 인용하자면
왜 컴퓨터가 10진 숫자가 아니라 비트를 사용할까? 분명한 이유는 컴퓨터에는 손가락이 없기 때문이다.
손가락이 한 숫자를 표현하기 때문에 그리 효율적이지 않을 것이다.
만약 각 손가락을 비트를 표현하는 데 사용한다면 1000개가 넘는 숫자를 셀 수 있을 것이다.
그 효율성을 설명하기 위해서는 컴퓨터 언어의 역사를 이야기해야할 것 같아서 여기서 멈춰야겠다.
메모리에 값을 저장한다고 했는데, 값의 형태는 여러 가지이므로 이를 어떻게 0,1의 형태로 저장할 것인지가 문제가 된다. 이 내용을 구체적으로 다루기에는 정리글로는 부족하고 연재 시리즈물이 되어야하지 않을까 싶다. 그리고 메모리에 대해서 정리한 이유는 데이터 타입을 이해하기 위한 사전지식으로 쉽게 이해하기 위함이었다.
결국 메모리에는 값들이 저장이 되는데, 이를 위해 적절한 크기의 공간을 확보하는 과정이 필요하며, 이 과정이 데이터 타입에 의해 결정된다. 물론 저장된 값들을 참조할 때도 데이터 타입에 따라 해당 메모리를 어떻게 해석할지 결정해야한다.
이 내용을 쉽게 이해하기 위한 개념으로 변수와 식별자를 들 수 있다. 설명만으로는 이해하기 쉽지 않고 혼용하여 사용하는 경우가 많지만, 예시(그림, 코드)를 보면 이해하는데 도움이 될 것이다.
변할 수 있는 데이터를 저장하는 공간
하나의 값을 저장하기 위해 확보한 메모리 공간 자체
데이터를 식별하는 이름
메모리 공간을 가리키는 이름(메모리 주소를 기억)
let age = 25; // 변수명 'age' → 식별자
const name = "John"; // 변수명 'name' → 식별자
function greet() { // 함수명 'greet' → 식별자
console.log("Hello!");
}
class Person { // 클래스명 'Person' → 식별자
constructor(name) {
this.name = name; // 객체 속성 'name' → 식별자
}
}
const user = {
id: 1, // 속성명 'id' → 식별자
username: "Alice", // 속성명 'username' → 식별자
};
function add(a, b) { // 매개변수 'a', 'b' → 식별자
return a + b;
}
식별자의 경우, 실행 컨텍스트에 등록되는데, 실행 컨텍스트에 대한 내용은 추후에 정리하고 이번 정리에선 메모리에 값이 저장되는 느낌과 이를 어떤 형태로 저장하고 참조할 수 있는 지 느낌만 알아가자.
모든 데이터는 메모리 주솟값을 통해 서로 구분하고 연결할 수 있다.