문자는 컴퓨터 내부에서 어떻게 나타내야 할까요?
이전 포스팅에서 컴퓨터는 0과 1로만 표현할 수 있다고 했으므로,
문자 역시 컴퓨터 내부에서 표현할 때 0과 1의 조합으로 나타내야 합니다.
어떤 문자를 컴퓨터 내부에서 표현하려면 특정 정수 값으로 정하자고 약속합니다. 예를 들자면 A를 얼마로 표현할 것인지 약속하는데, 이러한 코드 값을 모은 것을 '문자 세트'라고 하고 문자를 정해진 코드 값으로 변환하는 것을 '문자 인코딩(encoding)', 코드 값을 다시 문자로 변환하는 것을 '문자 디코딩(decoding)' 이라고 합니다.
가장 기본이 되는 문자 인코딩은 아스키(ASCII) 코드입니다. 영문자는 대문자, 소문자, 특수 문자, 기호를 포함해도 1바이트(28=256개)로 표현할 수 있기 때문에 아스키 코드는 1바이트만 사용합니다.
하지만, 한글을 포함한 다국어(영문자를 제외한)는 복잡하고 다양하기 때문에, 2바이트 이상을 사용하게 되는데, 이때 각 언어의 표준 인코딩을 정의해 놓은 것이 '유니코드(unicode)'입니다.
유니코드 1바이트는 아스키 코드 값과 호환되고, 그 밖의 문자를 2바이트나 그 이상의 조합으로 표현합니다. Java는 유니코드에 기반하여 문자를 표현하기 때문에, 문자 자료형인 char형은 2바이트를 사용합니다.
또한, 문자를 변수에 대입하면 문자 그대로 저장되는 것이 아니라 그 문자에 해당하는 정수 값(아스키 코드 값)이 저장됩니다.
Java는 UTF-16 인코딩을 사용합니다.
유니코드를 표현하는 인코딩 방법은 크게 UTF-8과 UTF-16이 있습니다. Java의 기본 인코딩 방식은 모든 문자를 2바이트로 표현하는 UTF-16 입니다. 그런데 모두 2바이트로 표현하면 1바이트로 표현할 수 있는 알파벳 같은 자료를 저장하는 경우에 메모리가 낭비될 수 있습니다.
아래 그림을 보겠습니다.
아스키 코드는 7비트로 표현할 수 있으며, 최대 1바이트 내에서 표현이 가능합니다. 그렇다면 UTF-8에서는 유니코드(최소 2바이트 ~ 최대 4바이트)를 어떻게 표현할까요? 그 방법은 바로 길이가 정해져 있지 않고, 필요에 의해 바이트가 가변적으로 늘어날 수 있기 때문입니다.
이때, UTF-8에서는 유니코드를 표현하기 위해서 바이트가 더 필요할 떄는 맨 앞에 10을 붙여서 표현합니다.
더 필요하다면 10을 하나 더 붙입니다.
이처럼 가변길이기 때문에 바이트가 더 필요하면 가변적으로 늘려서 표현합니다.
하지만, UTF– 16 인코딩 방식은
UTF-8과 동일하게 가변길이 이지만, 기본적으로 2바이트 이기때문에
아스키 코드와 같이 1바이트로 충분히 표현할 수 있을때도 2바이트를 소모하게 됩니다.
따라서 메모리 낭비가 적은, UTF-8 인코딩 방식을 주로 사용합니다.
'Computer Science' 카테고리의 다른 글
[CS] URI과 URL의 차이 (0) | 2023.03.16 |
---|---|
[CS] HTTP 웹 서버는 어떻게 동작할까? (0) | 2023.03.10 |
[CS] TCP 연결이라는 착각 / 3-way-handshake (0) | 2023.02.24 |
[CS] 컴퓨터의 데이터 / 비트(bit)와 바이트(bite) / 2진수와 10진수 / binary (0) | 2022.10.17 |
[CS] 스택(Stack)과 큐(Queue)에 관해서 (0) | 2022.09.18 |
댓글