컴퓨터는 0과 1로 표현하는데 문자 역시 컴퓨터 내부에서 표현할 때 0과 1의 조합으로 나타내야 한다. 예로 A
를 얼마로 표현할 것인지 약속을 하는데 이런 코드 값을 모아 둔 것을 '문자 세트'
라 한다. 이 때 문자를 정해진 코드 값으로 변환하는 것을 문자 인코딩(encoding)
이라 하며 반대는 문자 디코딩(decoding)
이라 한다.
1. 아스키(ASCII)
가장 기본이 되는 문자 인코딩으로 영문자
, 숫자
, 특수 문자
등을 나타내는 문자 세트이다.
1바이트(2⁸=256개)만 사용하며, 한글 또는 다른 언어 문자는 표현하기 어렵다.
2. 유니코드(unicode)
아스키에서 표현이 어려운 언어를 2바이트를 사용하여 표현하는데 이 때 각 언어의 표준 인코딩을 정의해놓은 것으로 1바이트는 아스키 코드 값과 호환되고, 그 밖의 문자를 2바이트나 그 이상의 조합으로 표현한다.
자바는 유니코드에 기반하여 문자를 표현하기 때문에, 문자 자료형인 char형
은 2바이트를 사용한다.
char myChar = 'A';
문자형에 문자 코드에 해당하는 정수(int)
를 입력할 경우 문자(char)
를 출력하고 문자를 정수형(int)
으로 변환할 경우 정수를 출력한다.
public static void main(String[] args) {
// TODO Auto-generated method stub
char ch1 = 'A';
System.out.println(ch1); // 문자 A
System.out.println((int)ch1); // 정수 65
char ch2 = 66; // 정수 값 대입
System.out.println(ch2); // 정수 값에 해당 된 문자 B 출력
char ch3 = 67; // 정수 값 대입
System.out.println(ch3); // 정수 값에 해당하는 문자 C 출력
System.out.println((char)ch3); // 정수 값에 해당하는 문자 C 출력
}
프로그램에서 문자를 사용할 때는 항상 작은따옴표('')
를 사용한다.
이 때 문자를 여러 개 이은 문자열의 경우 큰따옴표("")
를 사용하며 기본 자료형(char)
으로는 표현할 수 없다.
char a = 'A' // 'A'는 정수 값 65로 정해져 있는 문자
String b = "B" // "B"의 내부를 살펴보면 "B\0"과 같이 쓰인다.
char형
은 문자 자료형이지만 다른 자료형과 마찬가지로 컴퓨터 내부에서는 정수 값으로 표현되기 때문에 정수 자료형으로 분류하는 경우도 있다. 다른 정수 자료형과 차이점은 char형은 음수 값을 표현할 수 없다는 것
public class Sample {
public static void main(String[] args) {
int a = 65;
int b = -66;
char a2 = 65;
//char b2 = -66;
System.out.println((char)a); // A
System.out.println((char)b); // char형에 음수를 넣을 경우 오류가 발생하여 물은표(?)가 출력된다.
System.out.println(a2); // A
}
자바는 UTF-16 인코딩을 사용한다.
자바의 기본 인코딩은 모든 문자를 2바이트로 표현하는UTF-16
이다. 하지만 1바이트로 표현 가능한 알파벳 같은 자료를 저장하는 경우 메모리 낭비가 있을 수 있어 UTF-16에 비해메모리 낭비가 적고 전송 속도가 빠른 UTF-8을 많이 사용
한다.