Java 언어에서 자료형은 크게 기본형과 참조형, 두 개로 나누어진다.
그 중 변수에 실제 값(data)를 저장하는 기본형에 대해서 알아보자.
기본형에는 총 8개 타입이 존재한다.
이렇게 총 8개로 이제부터 하나씩 알아보자.
boolean 한가지 밖에 없다. 두 가지 값만을 표현하면 되므로 1bit이면 충분하지만 자바에서는 데이터를 다루는 최소 단위가 byte이므로 boolean 형의 크기는 1byte이다.
정수형의 short와
boolean power = true;
boolean checked = False; // X, 대소문자가 구분된다. true 또는 false 만 가능하다.
char 한가지밖에 없다. char ch = 'A'; // 문자 'A'를 char타입의 변수 ch에 저장
ch 변수 안에는 'A'가 저장되어있는게 아니라 'A'의 10진수 유니코드 값인 65가 저장되어 있다.
char ch = 'A';
char ch = 65;
// 이 두 개의 문장은 동일한 결과를 얻는다.
// 어떤 문자의 유니코드를 알고싶다면 정수형으로 변환해보면 된다.
int unicodeOfA = (int)ch;
아스키코드(ASCII)는 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계이다.
128개의 문자집합을 제공하는 아스키코드로는 전 세계의 모든 글자가 표현되지 않는 한계에 부딪혔다.
이 때 하나로 통일된 문자집합의 결과가 유니코드이다.
유니코드는 16비트를 사용해서 65536개(0~65535)를 표현할 수 있다.
자바는 유니코드를 예상하고 설계했기 때문에 char 타입의 크기가 2byte이다.
char형은 2byte(16bit)의 저장공간을 가진다.
( 216 = 65536 )개의 문자를 표현할 수 있다.
정수형의 short 타입과 2byte로 크기가 같다.
그러나 둘은 표현할 수 있는 값의 개수(216)만 같고 표현의 범위가 다르다.
short형은 ( -215 ~ 215-1 ) 이고 char형은 ( 0 ~ 216-1 ) 이다.
정수형에는 byte, short, int, long. 이 4가지의 타입이 있다.
오버플로우 : 타입이 표현할 수 있는 값의 범위를 넘어서는 것
short n1 = 32767
short n2 = (short)(n1 + 1);
System.out.println(n2);
위의 코드에서 n2가 32768이 나오기를 예상했지만 실제로는 -32768이 나온다.
32767이 short형에서 표현할 수 있는 최대의 값이어서
여기다가 1을 더하면 오버플로우가 발생하기 때문이다.
short n1 = -32768;
short n2 = (short)(n1 - 1);
System.out.println(n2);
위 코드 역시 오버플로우가 발생하여
예상한 값 -32769가 아니라 32767이 출력된다.
최소값보다 작아져도
언더플로우가 아닌오버플로우라고 부른다.C언어 개정 이후 Integer 연산에서
언더플로우용어는 사라졌다.
실수형에는 float, double. 이 2가지의 타입이 있다.
실수형도 정수형처럼 오버플로우가 발생한다.
// 1. 오버플로우
float f = Float.MAX_VALUE;
f = f * 2;
System.out.println(f);
// 2. 언더플로우
float g = Float.MIN_VALUE;
g = g / 2;
System.out.pritln(g);
실수형의 오버플로우를 확인해보기 위해서 이 코드를 실행했었다.
float f = Float.MAX_VALUE;
System.out.println((f + 1.0));
Infinity 값을 예상했지만 MAX.VALUE의 값이 그대로 나왔다...?
그 이유는 1은 정밀도에 오류를 내기에는 너무 작은 값이기 때문이다.
그럼 Float.MIN_VALUE - 1도 그대로일까?
float f = Float.MIN_VALUE;
System.out.println("MIN_VALUE : " + f);
System.out.println("MIN_VALUE minus 1 : " + (f-1.0));
이 결과는 -1.0 이 나온다. 그 이유는 실제 MIN_VALUE에서 1을 뺀 결과가 -1에 매우 가까운 수이기 때문이다. 반올림 후 -1.0으로 값을 출력한다.
참고) Float.MIN_VALUE 는 가장 작은 양수값이다.
표현할 수 있는 가장 작은 값은 -Float.MAX_VALUE 이다.