Language/JAVA

(JAVA)아스키코드와 유니코드

doheun 2023. 1. 10. 11:54
반응형

컴퓨터 언어(비트와 바이트)

우리가 프로그래밍을 할 때 사용하는 언어는 컴퓨터와 직접적으로 소통을 하는 것 같아보이지만 아니다.

프로그래밍마다 컴파일하는 과정이 모두 다르고 내부적으로 그 과정을 거쳐야 컴퓨터의 정보을 우리가 읽을 수 있는 것이다. 컴퓨터는 이러한 정보를 0과 1 두가지로 표현을 하게 되는데 이 데이터들의 최소단위를 비트라고 부른다.

하지만 사람들이 사용하는 문자를 표현하기에 이 단위는 너무 작아서 바이트라는 단위를 사용하게 된다.

우리는 1바이트=8비트라는 약속을 통해 0과1 두가지로 표현할 수 있는 비트를 8개의 공간을 만들어 256가지로 표현할 수 있다. 또한 비트들의 조합을 통해 우리는 컴퓨터로 'a'나 '가'와 같은 문자를 표현 할 수 있다.

아스키코드

우리가 사용하는 알파벳은 컴퓨터가 이해하도록 하기 위해 숫자와 1대1로 매칭을 시키는데 이러한 규칙을 국제적으로 정해놓은 표를 아스키코드 문자표라고 한다.

이런 형태로 되어있는데 필요할 때 마다 찾아서 보면되기 때문에 외울 필요는 없다.

이 표에서 알파벳 'A'를 보면 십진수 65로 정해져있는 것을 볼 수 있다. 이것을 0 과 1 로 표현 하면 아래와 같은 형태가 되는데 컴퓨터 내부에는 이렇게 저장이 된다.

아스키코드의 문제점

아스키코드는 7비트로 128개의 문자를 이진수로 변환해서 나타낼 수 있는데 이것은 알파벳과 특수기호 몇개로만 이루어진 것을 볼 수 있다. 확장된 아스키코드는 256개의 문자를 나타낼 수 있도록 했지만 다른언어나 기호를 표현하기에는 턱없이 적다. 그래서 나온 것이 유니코드이다.

유니코드

처음에는 아스키코드와는 다르게 2byte를 사용해서 대략6만개의 문자를 표현할 수 있었다. 하지만, 전세계의 언어를 담기에는 2바이트도 부족했다. 그래서 유니코드는 100만개 이상의 문자들을 나타낼 수 있는 문자 인코딩의 표준으로써 정하고 유니코드의 첫 128개 문자는 아스키코드와 동일하여 서로 호환 된다.

유니코드의 문제점

유니코드가 영어는 1바이트, 한글은 2바이트, 어떤 문자는 3바이트로 표현해야하는 상황이 발생할 때 혼동이 생긴다는 것이다. 그래서 유니코드에서도 이러한 현상을 막기위해 인코딩방식을 따로 정해두었다.

> 인코딩 방식의 종류 : UCS-2, UCS-4, UTF-7, UTF-8 , UTF-16, UTF-32

UTF-8 (Universal Coded Character Set + Transformation Format- N bit)

유니코드의 대표적인 인코딩 방식으로 한문자를 표현하기 위해서 1바이트에서 4바이트까지 사용한다.

어떤사람들은 모두 4바이트로 사용하면 혼동할 일이 없지 않냐고 할 수 있다.

예를 들어, 우리가 1바이트(8비트)로 표현할 수 있는 'A'와 같은 문자를 사용해야하는데 4바이트를 사용한다면 나머자 3바이트는 저장 공간의 낭비가 된다. 이것이 계속해서 쌓인다면 쓸데없이 공간을 차지하는 메모리가 엄청 많아질 것이다.

그래서, 어떤 바이트를 사용할지 하나씩 판별하여 저장을 하는 것이다. 판별하는 방식은 각각의 바이트의 첫번째 수에 있다. 첫번째 바이트가 0이면 1바이트로 인식하고 그렇지 않을 경우 2번째 바이트의 첫번째 수까지 읽어 0이면 2바이트, 이런식으로 1바이트에서 4바이트까지 판별할 수 있다.

UTF-16

UTF-16은 아스키코드와 동일한 범위를 표현할 때에도 앞에 8비트를 0으로 채워서최소 16비트= 2바이트를 사용한다.

또한, 3바이트는 사용하지 않고 2바이트와 4바이트만을 사용한다.

UTF-8에서 3바이트로 표현되는 문자들은 모두 2바이트로 표현이 가능하여 3바이트 문서를 UTF-16에서 사용할 경우 효율적이다.

정리

영문사용시

UTF-8는 기본 1바이트이고 표현범위에 따라 2,3,4바이트사용

UTF-16은 기본 2바이트이고 표현범위에 따라 2,4,바이트 사용

참고로 JAVA에서는 유니코드를 사용하기 때문에 Char형이 2byte 크기를 가지고 있다.

반응형

'Language > JAVA' 카테고리의 다른 글

(JAVA)String 메서드(문자열 자르기)  (0) 2023.01.13
(JAVA)String 비교  (0) 2023.01.13
(JAVA)final 예약어  (0) 2023.01.12
(JAVA)클래스 관련 용어  (0) 2023.01.11
(JAVA)public static void main(String[] args)란?  (0) 2023.01.10