Chapter 02 변수(Varialbe)
4. 기본형(primitive type)
문자형은 char
한 가지 자료형밖에 없다.
문자를 저장하기 위한 변수를 선언할 때 사용되며, char
타입의 변수는 단 하나의 문자만을 저장할 수 잇다.
char ch = 'A'; // 문자 'A'를 char타입의 변수 ch에 저장.
변수에 '문자'가 저장되는 것 같지만, 사실은 문자가 아닌 '문자의 유니코드(정수)'가 저장된다.
컴퓨터는 숫자밖에 모르기 때문에 모든 데이터를 숫자로 변환하여 저장하는 것이다.
문자 'A'의 유니코드는 65이므로, 변수 ch에는 65가 저장된다.
그래서 문자 리터럴 대신 무자의 유니코드를 직접 저장할 수도 있다.
문자 'A'의 유니코드는 10진수로 65이며, 아래의 두 문장은 동일한 결고를 얻는다.
char ch = 'A'; // 문자 'A'를 char타입의 변수 ch에 저장.
char ch = 65; // 문자의 코드를 직접 변수 ch에 저장.
만일 어떤 문자의 유니코드를 알고 싶으면, char
형 변수에 저장된 값을 정수형(int)으로 변환하면 된다.
int code = (int)ch; // ch에 저장된 값을 int타입으로 변화하여 저장한다.
어떤 타입(type, 형)을 다른 타입으로 변화하는 것을 형변화(캐스팅, casting)이라고 한다.
영문자 이외에 tab이나 backspace 등의 특수문자를 저장하려면, 다음과 같은 방법을 사용한다.
char tab = '\t'; // 변수 tab에 탭 문자를 저장
\tab
는 실제로 두 문자로 이루어져 있지만 한 문자(탭, tab)를 의미한다.
char
타입의 크기는 2 byte(=16 bit)이므로, 16자리의 2진수로 표현할 수 있는 정수의 개수인 65536개(=2^16)의 코드를 사용할 수 있으며, char
형 변수는 이 범위 내의 코드 중 하나를 저장할 수 있다. 예를 들어, 문자 'A'를 저장하면, 2진수 '0000000001000001'(10진수로 65)로 저장된다.
char
타입은 문자가 아닌 '문자의 유니코드(정수)'가 저장되고 표현형식 역시 정수형과 동일하다.
다만, 정수형과 달리 음수를 나타낼 필요가 없으므로 표현할 수 있는 값의 범위가 다르다.
2 byte(=16 bit)로는 모두 2^16(=65536)개의 값을 표현할 수 있는데, char
타입에 저장되는 값인 유니코드는 모두 양수(0 포함)이므로, '0~65535'의 범위를 가지며, 정수형인 short
은 벌반을 음수표현에 사용하므로 '-32768~32768'을 범위로 갖는다.
char ch = 'A' // char ch = 65;
short s = 65;
변수 ch
와 s
에 'A'와 65를 저장하면, 둘 다 2진수로 똑같은 값이 저장된다. 컴퓨터는 모든 값을 0과 1로 저장하기 때문이다.
System.out.println(ch); // A가 출력된다.
System.out.println(s); // 65가 출력된다.
그런데도 두 변수의 값을 출력해보면 결과가 다르다.
println()
은 변수의 타입이 정수형이면 변수에 저장된 값을 10진수로 해석하여 출력하고, 문자형이면 저장된 숫자에 해당하는 유니코드 문자를 출력하기 때문이다.
이처럼 값을 어떻게 해석하느냐에 따라 결과가 달라지므로 값만으로는 값을 해석할 수 없다. 값의 타입까지 알아야 올바르게 해석할 수 있는 것이다.
📑 원본 자료
- Java의 정석(3판) [남궁 성/도우출판/2016]