논리형은 'boolean' 한가지이며, boolean형 변수에는 true와 false 중 하나를 저장할 수 있다. 기본값은 false이다.
boolean power = true; boolean checked = False; // 에러. 대소문자가 구분됨. true 또는 false만 가능
문자형은 'char' 한가지이며, 단 하나의 문자만을 저장할 수 있다.
char ch = 'A' // 문자 'A'를 char 타입의 변수 ch에 저장 int code = (int)ch; // ch에 저장된 값을 int타입으로 변환하여 저장한다. '아스키코드'
char tab = '\t'; // 변수 tab에 탭 문자를 저장
✨ 예제 1
public class SpecialCharEx {
public static void main(String[] args) {
System.out.println('\'');
System.out.println("abc\t123\b456"); // \b에 의해 3이 지워진다.
System.out.println('\n'); // 개행(new line)문자 출력하고 개행
System.out.println("\"Hello\"");
System.out.println("c:\\");
}
}
백스페이스로 3이 지워지지 않고 깨지는 현상은 이클립스 콘솔 버그 현상이다.
정수형에는 4개의 자료형이 있다. byte(1) < short(2) < int(4) < long(8) (단위는 byte)
- n비트로 표현할 수 있는 정수의 개수: 2n개
- n비트로 표현할 수 있는 부호있는 정수의 범위: -2n-1~2n-1-1
- 1byte = 8bit
▶ 정수형 선택의 기준
byte와 short가 메모리를 조금 더 절약할 수 있지만, 연산 시 범위를 넘기 쉬우므로 대부분 int타입으로 선언하는 것이 좋다. 20억이 넘어서는 수를 다뤄야 할 경우는 long을 사용하면 된다.
▶ 오버플로우(overflow)
해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우라고 한다.
실수형은 실수를 저장하기 위한 타입으로 float와 double이 있으며 실수형의 범위와 정밀도는 다음과 같다.
▶ 오버플로우와 언더플로우
실수형에서 오버플로우가 발생하면 변수의 값은 '무한대'가 된다.
언더플로우는 실수형으로 표현할 수 없는 아주 작은 값, 즉 양의 최소값보다 작은 값이 되는 경우를 말하며 이 경우 변수의 값은 0이 된다.
▶ 정밀도
float타입의 정밀도가 7자리라는 것은, '7자리의 10진수를 오차없이 저장할 수 있다는 뜻'이다.
예를 들어, float 타입의 변수f에 '9.123456789123456789'를 저장한다면, 저장된 값은 '9.12345699999999999'이 될 수 있다.
정밀도가 7자리이므로 두 값의 앞의 7자리 값만 오차없이 저장되는 것이다.
✨ 예제 2
public class FloatEx1 {
public static void main(String[] args) {
float f = 9.12345678901234567890f;
float f2 = 1.2345678901234567890f;
double d = 9.12345678901234567890d;
System.out.printf("123456789012345678901234%n");
System.out.printf("f : %f%n", f); // 소수점 이하 6째자리까지 출력
System.out.printf("f : %24.20f%n", f); //전체 24자리 중 20자리는 소수점이하의 수를 출력
System.out.printf("f2 : %24.20f%n", f2);
System.out.printf("d : %24.20f%n", d);
}
}
저장 공간의 한계로 오차가 발생하여 빈자리가 공백과 0으로 채워지는 것을 볼 수 있다.
참고
자바의 정석(저자: 남궁성)
앞에서 다뤘던 기본형에 대해 더 자세히 다뤘다.
실수와 자릿수를 지정하는 방법이 익숙하지 않으므로 예제를 통해 더 연습해야 할 것 같다.
다음 포스팅은 형변환으로 변수 챕터의 마지막 포스팅이 되겠다.