메모리와 데이터
by 배부른코딩로그조금 생소하기 때문에 차근차근 뽀개보자..!
기본형과 참조형의 구분에 대해 이해하기 위해서 메모리와 데이터에 대한 배경지식이 필요합니다.
허허... 뭐하나 쉽게 이해하기 어렵죠. 뭐든지 쉬운 길을 없습니다..
1) 메모리와 데이터
컴퓨터는 0과 1로 모든 데이터를 기억하고 있습니다.
0과 1을 표현하는 단위를 비트(bit)라고 하며, 하나의 메모리 조각입니다.
각 비트는 고유한 식별자를 통해 위치를 확인할 수 있는데, 너무 작은 단위인 비트로 하기에는 비효율적이죠.
그래서 여러 조각들을 묶어서 새로운 단위를 만들었고, 이로써 표현 가능한 값을 넓히고 검색 시간도 줄일 수 있습니다.
여러 조각들의 묶음이 바로 바이트(byte)입니다.
1byte는 (256)개의 주소를 2byte는 (65536)개의 주소값을 표현할 수 있게 되었습니다.
비트 바이트는 배경지식으로 넘어가고, 컴퓨터에서 데이터를 저장하는 간단히 정리해봅니다.
2) 데이터 변수 선언과 데이터 할당
먼저, 변수와 식별자를 구분해보면 다음과 같습니다.
변수는 '변할 수 있는 수', 식별자는 '변수명'이죠.
그럼 바로 변수 선언과 데이터 할당에 대해 나타내봅니다.
var data = 'allocation'; // 변수 선언과 할당
변 수 영 역 |
주소 | ... | 1001 | 1002 | 1003 | ... |
데이터 | @xxxx | 1),2) data 5) @5001 |
||||
데이터 영 역 |
주소 | ... | 5001 | 5002 | 5003 | ... |
데이터 | 3),4) 'allocation' |
변수를 선언하고 값을 할당하게 되면, 컴퓨터 내부적으로 아래와 같이 수행합니다. (실제와 좀 다르니 개념만..ㅇㅂㅇ)
- 변수 영역에서 빈공간을 찾습니다.
- 빈공간인 @1002에 식별자 data를 지정합니다.
- 데이터 영역의 빈공간인 @5001에 문자열 'allocation'을 저장합니다.
- 변수 영역에서 data라는 식별자를 검색합니다.
- 데이터가 저장된 공간의 주소를 @1002에 저장합니다.
var data = 'allocation';
data = 'other';
변 수 영 역 |
주소 | ... | 1001 | 1002 | 1003 | ... |
데이터 | @xxxx | 3) data 4) @5002 |
||||
데이터 영 역 |
주소 | ... | 5001 | 5002 | 5003 | ... |
데이터 | 1) 'allocation' | 2) 'other' |
만약 할당된 값을 변경한다면, 아래와 같은 과정을 수행합니다.
- 데이터 영역에서 'other' 이라는 데이터가 존재하는지 검색합니다.
- 없다면, 데이터 영역의 빈공간을 찾습니다. 그리고 값을 저장합니다.
- 변수 영역에서 data라는 식별자를 검색합니다.
- 데이터가 저장된 공간의 주소를 저장합니다.
해당 과정에서 특이한 점이 있습니다. @5001 주소에 값을 변경하지 않고, 새로운 공간에 변경된 값을 넣습니다.
기존 문자열에 어떤 변환을 가하든 상관 없이 무조건 새로 만들어 별도의 공간에 저장합니다.
이유는 다음과 같습니다.
변수 영역과 데이터 영역이 나눠진 이유입니다. 즉, 메모리의 효율적인 관리를 위해서 입니다.
동일한 값을 동일한 데이터 영역에 보관하고, 이를 변수영역에서 참조하는 겁니다.
변 수 영 역 |
주소 | ... | 1001 | 1002 | 1003 | ... |
데이터 | sample @5001 |
data @5001 → @5002 |
||||
데이터 영 역 |
주소 | ... | 5001 | 5002 | 5003 | ... |
데이터 | 'allocation' (2 → 1) | 'other' (1) | 'dummy' (0) |
위를 보시면, 1001과 1002이는 동일한 데이터영역의 주소를 참조하고 있었습니다.
변수 data의 값을 'other'로 변경하면 참조하는 주소값만 5002로 변경하는 겁니다.
그러면, 참조를 아무도 않하고 있는 데이터는 메모리 자원을 낭비하는 데이터라고 말하실 수 있습니다.
맞습니다!
그래서 가비지 컬렉터라는 녀석이 메모리를 보고 있다가 특정 데이터를 참조하는 변수가 없다면 삭제해버립니다.
이처럼 변수와 데이터 영역을 분리하므로써 중복된 데이터에 대한 처리 효율을 높일 수 있었다고 합니다.
[출처] '코어 자바스크립트 - 핵심 개념과 동작 원리로 이해하는 자바스크립트 프로그래밍', 정재남 지음
'자바스크립트 > 코어 자바스크립트' 카테고리의 다른 글
클로저의 활용 (0) | 2020.04.07 |
---|---|
클로저(Closure) (0) | 2020.04.05 |
콜백 함수(Callback function) (0) | 2020.03.31 |
this (0) | 2020.03.28 |
데이터 타입의 종류 (0) | 2020.03.21 |
블로그의 정보
배부른코딩로그
배부른코딩로그