상세 컨텐츠

본문 제목

자바에 메모리가 저장되는 구조와 원리

IT/프로그래밍

by James Lee. 2015. 12. 6. 21:00

본문

이 포스트에서는 자바에서 메모리 구조가 어떻게 되어있고, 값이 어떻게 저장되는지를 살펴본다.


먼저 'a'라는 문자가 메모리에 어떻게 저장되는지를 생각해보자


메모리 구조는 1바이트를 단위로 한다고 가정한다.


'a'의 유니코드값은 97이다.


그렇다면 1바이트에도 저장 할 수 있다 (-128~127)


하지만 자바에서의 char은 2바이트이다.


그럼 2바이트에 'a'가 어떤 형태로 저장될까?


아래의 메모리 구조를 살펴보면

바로 앞번지에 0이 들어가고, 뒷번지에 a라는 값이 들어간다.

즉, 남는 번지는 0으로 비워놓는다는 것이다.


이는 a = 0a, 10 = 010과 같은 원리이다.


문자열 "ab한글"을 대상으로 String.getBytes(), String.getChars()를 사용했을때,


Byte배열로 가져오는것과 Char배열로 가져오는것은 차이가 있다.


먼저 "ab한글"이 저장된 메모리 구조는 아래와 같다.


D55c -> "한" 의 유니코드값

AE1b -> "글" 의 유니코드값


여기서 한글이 왜 2바이트인지 알 수 있다.


한글은 11172가지의 문자를 표현할 수 있다.


따라서 1바이트로는 한글의 가짓수를 전부 표현할 수가 없다. (C와 같은 언어에서는 char이 1바이트였기 때문에 char에 한글이 저장이 안된다)


따라서 2바이트가 되어야 한글을 표현할 수가 있다.

Java에서는 char가 2바이트이기 때문에 한글도 들어갈 수 있다.

예를들어 D55c를 보자, D와 c를 보고 짐작할 수 있듯이 16진수로 표시되어 있다.

16진수가 4개 있으면? 이진수로 나타내면 대략 0000 0000 0000 0000의 형태일 것이다.

이진수 16개, bit 16개 -> 2바이트

따라서 D55c는 2바이트로 표현된 숫자라는것을 알 수 있다.


그럼 먼저 String.getChars()메소드를 이용하여 Char 배열에 "ab한글"이 저장되는 구조를 보자


각 인덱스마다 문자 단위로 잘 저장되어 있다.


메모리에서 배열로 매핑되는 과정은 아래와 같다.

0, 2, 4, 6번지에서 값을 가져온다.


다음은 String.getBytes()메소드를 사용하여 Byte배열에 "ab한글"이 저장되는 구조를 보자.



char배열과는 다르다.

우선 값들이 다 유니코드로 표현되어 있다.

왜냐하면 Byte는 2바이트인 문자를 지원하지 않기 때문이다.


byte배열이 어떻게 값을 가져오는지 살펴보자.


뭔가 중요한 사실을 발견했는가?

0번지와 2번지에 있는 00이라는 값을 가져오지 않았다.

byte배열은 값을 가져올때 빈 값(0)은 가져오지 않는다.

따라서 적절하게 getBytes를 쓰면 메모리를 조금더 절약 할 수도 있다.


그렇다면 이 차이를 알면 어떤 도움이 될까?

결론적으로는 현재는 큰 도움은 되지 않는다고 한다.

메모리가 중요했던 예전에는 전송 데이터를 줄이는 방식으로 자주 사용했다고 하는데 요즘에는 기술이 좋아져서 별반 차이는 없기 때문이다.


하지만 이러한 기본적인 아키텍쳐를 알고 나면 자바를 이해하는데에 조금 더 도움이 될 수 있을거라고 생각한다. 

관련글 더보기

댓글 영역