자바의 문자 자료형
목차
지난 포스팅에 이어서 자바의 자료형을 알아보겠습니다.
문자 자료형
자바에서 문자를 표현하는 자료형은 char 형입니다. 이는 character(문자)의 약자입니다.
문자는 컴퓨터에서 매우 중요한 위치를 가집니다. 컴퓨터를 수를 다루지만 인간은 문자를 다룹니다. 인간은 문자를 읽고 컴퓨터는 숫자를 읽습니다. 궁극적으로 컴퓨터의 명령을 실행시키기 위해서는 모든 문자나 표현방식을 숫자로 바꿔야 합니다.
코딩이라고 하는 단어는 여기서 나왔습니다. 문자를 컴퓨터에게 읽히기 위해서 encoding 암호화 작업을 합니다. 암호화 작업을 하면 컴퓨터가 읽을 수 있는 숫자가 됩니다. 그런데 사람은 읽을 수 없으므로 다시 사람이 읽기 위해서 복호화 decoding 작업을 합니다. 숫자는 다시 문자가 됩니다.
컴퓨터의 초창기 시절에는 각자 컴퓨터를 만든 사람이 이 규칙을 정했습니다. 그런데 여러 과학자들이 각자의 코딩 규칙을 사용하니 소통이 안됩니다. 어떤 컴퓨터에서 A 가 30인데 다른 컴퓨터에서는 20입니다. 호환이 안됩니다.
그래서 컴퓨터과학의 촉진을 위해 사람들이 모여서 만든 첫번째 문자 규칙은 ASCII 라는 7비트 문자체계입니다. 여기서 코드를 통일합니다. 대문자 A는 정수 65와 같다. B는 66 C는 67 … 이렇게 정해서 쓰니 다른 컴퓨터에서 쓰던 문자들이 서로 호환이 되기 시작합니다.
아스키 코드(ASCII)
이렇게 해서 아스키 코드가 만들어 집니다. 아스키코드는 7비트 128개의 문자이며 0~31과127은 컨트롤 문자이고 32부터126까지가 출력을 위한 문자입니다.
컨트롤 문자는 하나의 명령어, 연산자와 유사한 문자입니다. 문자열은 사람이 읽는 것이지만 컨트롤 문자를 사용하면 사람 뿐 아니라 프린터기, 오디오, 스크린에서 줄바꿈 등 다양한 기기가 인식해서 사용할 수 있습니다.
이렇게 아스키코드는 7비트에 불과한 작은 공간만으로도 인간이 영어를 사용해서 읽거나 주변 입출력장치를 컨트롤 하는 용도로 사용할 수 있도록 효율적인 설계가 되있습니다.
한글코드의 의문
여기서 한가지 의문이 생길 수 있습니다. 한글은 안들어 갔나요? 처음에 한글은 안들어 갔습니다. 컴퓨터를 만든 사람들이 영미권 과학자들이었기 때문에 공용어인 영어를 첫번째로 통일시킨 것 입니다. 한국에 컴퓨터가 도입되고 이제 한글을 표현해야 하니까 독자적인 문자 코드체계가 만들어집니다.
너무 당연한 이야기입니다만, 여기서 이야기하고자 하는 것은 어느 나라의 문자건 상관없이 숫자로 표현해야 컴퓨터가 이해할 수 있다는 점입니다. 영어뿐 아니라 독일어, 일본어, 프랑스어, 중국어 모두다 숫자로 변환되야 합니다.
현재 상용화된 문자체계인 아스키코드나 유니코드에 대한 내용은 문자를 다루다 보면 언젠가 다루게 될 것 문제입니다. 문자 자료형 char와 연결되는 부분이 있다는 정도를 알고 가면 됩니다.
자바의 char 형
자바로 돌아와서 자바의 char형은 2바이트 입니다. char 형의 범위는 2의16승인 0 ~ 65535 이며 2바이트 정수형인 short 와 다른 점은 char 형은 음수 – 를 할당할 수 없습니다. char 형에 숫자를 입력하고 표준출력함수로 출력해보면 각종 언어의 문자를 출력합니다.
자바는 2바이트 유니코드를 사용합니다. 한글의 유니코드표를 보고 변환하면 정확하게 출력되는 것을 볼 수 있습니다. 예를 들어 ‘가’는 16진수로 AC00 이며 10진수로 44032 입니다.
char myChar = 44032; System.out.println(myChar);
가
위의 코드는 이해가 쉽습니다. char 형에 정수를 저장하는 것이니까요.
char ch1 = 'A'; System.out.println(ch1);
그럼 위의 코드는 어떻습니까? 출력은 A로 같은 문자입니다.
실제 일어나는 일은 ch1에 A를 저장하는게 아니라 A의 아스키코드인 정수 65를 저장합니다. 즉 컴파일러는 A를 보고 아스키 테이블을 찾아서 65를 알아낸 후 ch1에 정수로 할당합니다.
println 함수는 ch1의 값이 65인 것과 char 형인 것을 확인 후에 아스키 테이블로 가서 65 에 매치되어있는 문자 A 를 화면에 출력합니다.
타입캐스팅 char
이제 아스키 코드의 인코딩을 알겠습니다. 그렇다면 반대로 디코딩도 해보겠습니다.
디코딩은 숫자에서 문자로 변환하는 과정입니다. println 함수가 자동으로 해주는 일이기 때문에 콘솔 프로그램에서 신경 쓸 일은 잘 없을 것입니다. 하지만 직접 변환해 보면 인코딩과 디코딩 양방향의 원리를 이해하기 쉽습니다.
2바이트의 유니코드를 사용하는 자바의 아스키 문자를 출력해보겠습니다.
정수 i를 받아서 (cast) 로 println 에 전달하면 아스키 문자를 출력합니다. i는 int형입니다.
for (int i = 33; i < 127; i++) { System.out.print((char)i); if(i%20 == 0) System.out.println();; }
!"#$%&'( )*+,-./0123456789:;< =>?@ABCDEFGHIJKLMNOP QRSTUVWXYZ[\]^_`abcd efghijklmnopqrstuvwx yz{|}~
제어문자를 제외하고 출력했습니다. 32는 스페이스 문자이기 때문에 보이지 않습니다.
이런 식으로 유니코드의 한글을 출력해보겠습니다.
for (int i = 44032; i < 55296; i++) { System.out.print((char)i); if(i%20 == 0) System.out.println();; }
초성 중성 종성으로 만드는 한글 조합의 개수는 11,172개입니다. 이 안에 한글이 들어있습니다. 16비트의 65000개 공간에 11,172개 코드를 쓰니까 상당히 많이 쓰고 있습니다. 다른 나라는 기껏해야 알파벳의 변형들인데요.
유니코드에서 한글의 존재감을 보면 신기하기도 합니다. 글자가 이렇게 많은 민족이었나? 11,172개 글자가 들어감으로써 유니코드 기본 다국어 평면의 무려 6분의1을 차지합니다. 중국의 한자는 기본 다국어 평면에 27,000개가 들어가지만 한글도 한자를 사용하고 있고 인구수를 대비하면 상당한 포션이라고 할 수 있습니다. 뒤로 안밀리고 앞쪽에 다 들어가서 다행입니다.
유니코드는 16비트의 범위를 넘어서는 문자들은 보조 다국어 평면을 지원합니다.
유니코드의 경우 아래와 같이 \u 의 방식으로 16진수 코드를 직접 입력할 수 있습니다. 유니코드 테이블을 보면 저렇게 되어있습니다. 굳이 10진수로 변형할 필요가 없죠.
System.out.println('\uAC00');
요약
자바의 문자 자료형에 대하여 알아봤습니다.
아스키 코드의 개념을 이해하면 컴퓨터에서 문자가 어떻게 동작하는지 알 수 있습니다.
문자와 숫자의 변환하는 과정을 실습해 보시길 바랍니다.
외부참조문서
Unicode – The World Standard for Text and Emoji