Java

char 자료형의 재밌는 특징 (feat. 문자 인코딩 - 아스키코드, 유니코드)

joungdev 2024. 7. 15. 20:50

char 자료형

 우리가 자주 사용하지만 독보적인 특징을 가진 char 자료형에 대해 알아보자.

 

 char 자료형은 값이 문자 한개를 받는 문자형(character) 자료형이다. 문자 자료형 'char'는 단일 문자를 저장하는 데 사용되는 16비트 데이터 타입으로, 유니코드 문자를 표현할 수 있다. 


문자 인코딩

 유니코드가 무엇일까. 그리고 아스키 코드라는 것도 익히 들어봤을 것이다. 이러한 코드라고 불리우는 것들은 사실 문자 인코딩의 한 형태를 의미한다. 인코딩이란, 문자를 컴퓨터가 이해할 수 있는 숫자(코드)로 변환하는 과정을 의미한다. 문자의 디지털 표현을 정의하는 체계로, 다양한 문자 인코딩 방식이 존재한다. 이들 중 가장 널리 사용되고 있는 것이 바로 아스키 코드와 유니코드인 것이다. 그리고, 유니코드의 다양한 인코딩 방식으로 UTF-8, UTF-16, UTF-32 가 있다. char 자료형을 제대로 이해하기 위해 아스키 코드와 유니코드를 간단하게 알아보자.


아스키 코드

 아스키(ASCII, American Standard Code for Information Interchange)는 초기 컴퓨터 시스템에서 표준 문자 인코딩으로 사용되었다.  아스키 코드는 7비트를 사용하여 128개의 문자를 표현할 수 있다. 나머지 1비트는 통신 에러 검출을 위해서 사용되어진다고 한다. 다음은 아스키 코드 표의 일부를 보여주는 표 이다.

출처 : 나무위키

 아스키 코드는 33개의 출력 불가능한 제어 문자들과 공백을 포함한 95개의 출력 가능한 문자들로 구성되어 총 128개로 이뤄진다. 아스키 코드는 영문 알파벳 대소문자와 숫자 10개 특수문자 32개를 표현할 수 있다. 하지만 세상에는 너무나도 많은 문자들이 존재하고 아스키 코드는 이를 해결하기 위해 여러 시도를 해보았으나 문자가 깨지는 등의 이유로 인해 다른 해결책을 찾아야 했다. 그것이 바로 유니코드 이다. 


유니코드

 char 자료형을 쉽게 이해하기 위해선 일단 유니코드에 대해서도 간략하게 알아보는 편이 좋다. 그 이유는 char 자료형이 유니코드 문자 집합을 기반으로 하기 때문이다. 

 

유니코드(Unicode)는 전 세계의 모든 문자를 다루도록 설계된 표준 문자 전산 처리 방식이다. 전 세계 모든 문자를 담는 ISO/IEC 10646 코드표를 사용함으로써, 각 언어와 문자 체계에 따른 충돌 문제를 해결하였다. 따라서 유니코드를 사용하면 한글과 신자체, 간체자, 아랍 문자 등을 통일된 환경에서 사용할 수 있다.

 

 유니코드는 16비트 크기로 문자를 표현한다. 0 ~ 65535 까지의 유니코드 포인트를 표현할 수 있으며, 유니코드 표준은 아스키 코드의 모든 문자를 포함하고 있기 때문에, 아스키 코드로 표현된 모든 문자는 유니코드에서도 동일하게 표현될 수 있다. 

 

 유니코드 문자의 경우 해당 글자의 코드를 표기할 때 U+(16진수 숫자)라고 쓴다. 예를 들면 한글 '가'는 유니코드에서 16진수로 AC00(10진수의 44032)라는 코드 넘버를 가지는데, 이것을 U+AC00이라고 적는 식이다. 문자 표기 관례는 아니지만 16진수 표기의 관례를 따라 0x를 붙여 0xAC00라고 표기된 경우도 간혹 있다.

 

 이처럼 유니코드는 굉장히 많고 광범위한 범위의 문자를 표현함으로써 아스키 코드의 문제점을 해결하였고 자바에서는 이를 활용하여 char 자료형의 범위를 2byte로 사용한다. 즉, 유니코드로 표현된 문자들을 저장한다는 것이다. 


 char 자료형의 리터럴 표현

 문자 리터럴은 작은 따옴표(' ')로 표현된다. 

char c = 'A';

 

 또는 유니코드 이스케이프 시퀀스를 사용하여 문자를 표현할 수도 있다. 프로그래밍 언어에서 유니코드 문자를 직접 코드에 삽입할 때에는 유니코드 이스케이프 시퀀스를 사용할 수 있다. 자바에서는 '\u' 다음에 4자리 16진수 숫자를 사용하여 유니코드 문자를 표현한다.

char c = '\u0041';

 

 여기서 '\u0041'는 유니코드 코드 넘버로, 16진수 0041은 10진수로 65이며 이는 아스키 코드에서 'A'와 동일하다.


'char'와 'int' 간의 형변환

 

 앞서, 우리는 char 자료형이 내부적으로 정수로 저장된다는 것을 알았다. 때문에, 'int'로의 형변환이 가능하다. 

// char형에서 int로의 형변환

char c = 'A';
int asciiValue = (int)c; // int의 값의 범위가 더 크기 때문에 자동형변환 가능

// 65

 

이와 반대로 'int'를 'char'로 형변환하면 유니코드 값을 가진 문자를 얻을 수 있다.

//int를 char로 형변환

int value = 65;
char c = (char)value;

// 'A'

 

하지만 유니코드에는 음수가 없기 때문에 음수 값을 넣게 되면 오류가 날 수 있다.

int value = -65;
char cc = (char)value;

// 오류 발생!!

추가 내용

 

문자 연산

 char는 숫자 데이터 타입처럼 연산이 가능하다. 예를 들어, 문자 'A'에 1을 더하면 다음 문자 'B' 된다.

char c = 'A';
c = (char) (c + 1); // 'B'

 

문자 비교

 char는 비교 연산을 통해 순서를 판단할 수 있다. 이는 유니코드 값의 크기를 비교하는 것과 동일하다.

char a = 'A';
char b = 'B';
boolean isGreater = a > b; // false

 

문자열과의 관계

 'char'는 문자열('String')의 기본 구성 요소이다. 문자열은 'char' 배열로 구현되며, 문자열에서 개별 문자에 접근할 때 'char' 자료형을 사용한다.

String str = "Hello";
char firstChar = str.charAt(0); // 'H'

 

이스케이프 시퀀스

 'char'는 다양한 이스케이프 시퀀스를 사용할 수 있다.

char newLine = '\n'; // 줄바꿈

 오늘은 char 자료형에 대해 알아보면서 문자의 인코딩, 이에 따른 유니코드와 아스키코드에 대한 간단한 내용을 알아보았다. 단순히 문자 하나를 저장한다고 생각했던 char 자료형이 이러한 특징을 가졌다는 것이 굉장히 신선하게 다가왔다.

반응형

'Java' 카테고리의 다른 글

Java는 어떻게 플랫폼에 독립적일까? - JVM  (0) 2024.06.25