Java 기본형 2

2021. 5. 30. 18:00Java

 특수 문자 다루기

영문자 이외에 tap이나 backspace등의 특수문자를 저장하려면, 아래와 같이 조금 툭별한 방법을 사용한다.

char tab = '\t';  //변수 tab에 탭 문자를 저장

Q: char형은 문자만 가능하잖아 근데 \t는 두개아니야?

A: '\t'는 실제로는 두 문자로 이루어져 있지만 한 문자(탭, tab)을 의미한다. 아래의 표는 탭과 같이 특수한 문자를 어떻게 표현할 수 있는지 알려준다.

char타입의 표현 형식

char타입의 크기는 2byte(=16bit)이므로, 16자리의 2진수로 표현할 수 있는 정수의 개수인 65536개(=2의16승)의 코드를 사용할 수 있으며, char형 변수는 이 범위 내의 코드 중 하나를 저장할 수 있다. 예를 들어, 문자 'A'를 저장하면, 아래와 같이 2진수 '0000000001000001'(10진수로 65)로 저장된다.

char타입은 문자를 저장할 변수를 선언하기 위한 것이지만, 실제로 char타입의 변수에는 문자가 아닌 '문자의 유니코드(정수)'가 저장되고 표현형식 역시 정수형과 동일하다. 다만, 정수형과 달리 음수를 나타낼 필요가 없으므로 표현할 수 있는 값의 변위가 다르다. 2byte(=16bit)로는 모두 2의16승(= 65536)개의 값을 표현할 수 있는데, char타입에 저장되는 값인 유니코드는 모두 양수(0 포함)이므로, 0 ~ 66535의 범위를 가지며, 정수형인 short은 절반을 음수표현에 사용하므로 -32768 ~ 32767을 범위로 갖는다.

16bit로 표현할 수 있는 정수의 개수: 2의16승 개(65536개)
short타입의 표현범위: -2의15승 ~ 2의15승 -1 (-32768 ~ 32767 )
char타입의 표현범위: 0 ~ 2의16승 -1 ( 0 ~ 65535 )

 

다음과 같이 변수에 ch와 s에 'A'와 65를 저장하면, 둘 다 2진수로 똑같은 값이 저장된다. 컴퓨터는 모든값을 0과 1로 바꾸어 저장하기 때문이다.

char ch = 'A';   // char ch = 65;
short s = 65;

syso(ch);   // A가 출력된다.
syso(s);    // 65가 출력된다.

그런데도 두 변수의 값을 출력해보면 결과가 다르다. println()은 변수의 타입이 정수형이면 변수에 저장된 값을 10진수로 해석하여 출력하고, 문자형이면 저장된 숫자에 해당하는 유니코드 문자를 출력하기 때문이다.

이처럼 값은 어떻게 해석하느냐에 따라 결과가 달라지므로 값만으로는 값을 해석할 수 없다. 값의 타입까지 알아야 올바르게 해석할 수 있는 것이다. 예를들어 '1231'이라는 값이 있을 때, 이 값의 타입을 모르면, 이 값을 '천이백삼십일'로 해석해야할지, 아니면 12월31일이나 12시 31분으로 해석해야 할지 알 수 없다.


정수형 - byte, short, int , long

정수형의 기본 자료형(defeult data type)은 int이다.

정수형의 표현형식과 범위

어떤 진법의 리터럴을 변수에 저장해도 실제로는 2진수로 바뀌어 저장된다. 이 2진수가 저장되는 형식은 크게 정수형과 실수형이 있으며, 정수형은 다음과 같은 형식으로 저장된다.

모든 정수형은 부호있는 정수이므로 왼쪽의 첫 번쨰 비트를 부호비트(sign bit)로 사용하고, 나머지는 값을 표현하는데 사용한다. 그래서 n비트로 표현할 수 있는 값의 개수인 2의n승개에서, 절반인 0으로 시작하는 2의n승 -1개의 값을 양수(0도 포함)의 표현에 사용하고, 나머지 절반인 1로 시작하는 2의n승 -1개의 값은 음수의 표현에 사용한다.

그래서 정수형은 타입의 크기만 알면, 최대값과 최소값을 쉽게 계산해 낼 수 있다.

n비트로 표현할 수 있는 정수의 개수: 2의n승 개(= 2의 n승-1개 + 2의n승 -1개) 
n비트로 표현할 수 있는 부호있는 정수의 범위: -2의n승-1개 ~ 2의n승-1개 - 1

위의 범위의 최대값에서 1을 뺴는 이유는 범위에 0이 포함되기 때문이다. 예를 들어 byte의 경우 크기가 1byte(=8 bit)이므로, byte타입의 변수에 저장할 수 있는 값의 범위는 -128 ~ 127이다.

8비트로 표현할 수 있는 정수의 개수: 2의8승개(=2의7승 + 2의7승)
8비트로 표현할 수 있는 부호있는 정수의 범위: -2의7승 ~ 2의7승 - 1( -128 ~ 127 )

이처럼 타입의 크기만 알면, 모든 정수형의 표현범위를 쉽게 계산해낼 수 있다.

 

'Java' 카테고리의 다른 글

Java 기본형 4  (0) 2021.06.01
Java 기본형 3  (0) 2021.05.31
Java 기본형  (0) 2021.05.29
Java 진법 4  (0) 2021.05.28
Java 진법 3  (0) 2021.05.27