1. 논리형 - boolean
논리형은 'boolean' 한 가지만 있다. boolean형 변수에는 true와 false중 하나를 저장할 수 있으며 기본값(default)은 false다. boolean형은 주로 논리구현에 사용되며, 예를 들면 on/off, yes/no와 같은 형태로 쓰인다.
boolean power = true;
boolean checked = False; //에러 >> 대소문자가 구분되며 true or false만 가능
2. 문자형 - char
문자형도 'char'라는 한 가지 자료형만 있다. 문자를 저장하기 위한 변수를 선언할 때 사용되며, char타입의 변수는 단 하나의 문자만 저장할 수 있는 특징을 가지고 있다.
char ch = 'A'; //문자 A를 char 타입의 변수 ch에 저장
char ch = 65; //문자의 코드를 직접 변수 ch에 저장
//어떤 문자의 유니코드 값을 알고 싶다면 변수에 저장된 값을 정수형으로 변환하면 된다
int code = (int)ch;
하지만 여기서 알아야 할 것은 문자 'A'는 말 그대로 문자인 것 같지만 실상은 문자의 유니코드인 '정수'가 저장된다는 점이다. 왜냐하면 컴퓨터는 숫자만 알기 때문에 모든 데이터를 숫자로 변환하여 저장하기 때문에. 그러므로 문자 'A'의 유니코드는 65이므로, 변수 ch에는 65가 저장된다.
다만 정수형이라 하더라도 음수를 나타낼 필요가 없기 때문에 표현할 수 있는 값의 범위가 다르다. char는 2byte이므로 이를 bit형으로 표현하면 16bit므로 2의16승으로 0~65536의 범위를 갖는다. 이처럼 문자를 코드로 변환하는 것을 '문자 인코딩(encoding)'이라 하며, 그 반대로 변환하는 것을 '문자 디코딩(decoding)'이라고 하며, 문자를 저장할 때는 인코딩을 해서 숫자로 변환하고, 저장된 문자를 읽어올 때는 디코딩을 해서 숫자를 원래의 문자로 되돌리는 역할을 한다.
3. 정수형 - byte, short, int, long
정수형의 크기와 종류
byte(1byte) < short(2byte) < int(4byte) < long(8byte)
정수 표현식 예시(byte): 맨 앞자리는 음/양수를 분별하기 위한 용도로 사용된다. 0이면 양수, 1이면 음수로 표기된다.
byte의 표현방식(8비트) |
종류 |
값의 개수 |
00000000 ~ 01111111 |
0, 양수 |
2^7개(0~127) |
10000000 ~ 11111111 |
음수 |
2^7개(-128~-1) |
정수형은 정수값의 범위에 따라 4개의 정수형 중에서 하나를 선택하면 되지만 기본형은 int형이므로 되도록 int형으로 사용하는 것이 좋다. byte나 short가 int보다 크기가 작아 메모리를 좀 더 절약할 수 있겠지만, 저장할 수 있는 값의 범위가 작은 편이기 때문에 연산에 범위를 초과하여 잘못된 결과를 가져올 수 있기 때문이다. 또한 JVM의 피연산자 스택이 피연산자를 4byte 단위로 저장하기 때문에 크기가 4byte보다 작은 자료형(byte, short)의 값을 계산할 땐 4byte로 변환하여 연산이 수행되기 때문에 오히려 int를 사용하는 것이 더 효율적이다.
int형의 범위는 약 +-20억정도 되므로, 20억을 넘어서는 수를 다뤄야 할 때는 long 타입의 정수를 사용하면 된다. 만약 사용하는 타입이 표현할 수 있는 값의 범위를 넘어설 경우 오버플로우(Overflow)가 발생하는데, 오버플로우는 에러가 발생하는 것이 아닌, 원하는 값을 얻지 못하는 결과를 초래한다.
4. 실수형 - float, double
타입 | 저장 가능한 값의 범위(양수) | 정밀도 | 크기(byte) |
float | 1.4 X 10^-45 ~ 3.4 X 10^38 | 7자리 | 4 |
double | 4.9 X 10^-324 ~ 1.8 X 10^308 | 15자리 | 8 |
실수형의 구성 - 부호(S), 지수(E), 가수(M)
기호 | 의미 | 설명 |
S | 부호(Sign bit) | 1bit로 0이면 양수, 1이면 음수 |
E | 지수(Exponent) | 부호있는 정수로 지수의 범위는 -127~128(float), -1023~1024(double) |
M | 가수(Mantissa) | 실제 값을 저장하는 부분으로 10진수로 7자리(float), 15자리(double)의 정밀도로 저장 |
정수형과 실수형의 차이점
1) 오버플로우(overflow): 정수형의 오버플로우는 변수의 값이 표현범위를 벗어나 표현되지만, 실수형의 오버플로우는 '무한대'로 나타난다.
2) 언더플로우(underflow): 언더플로우는 실수형으로 표현할 수 없는 아주 작은 값, 즉 양의 최소값보다 작은 값이 되는 경우를 말한다. 이 때 변수의 값은 0이 된다.
실수형 타입을 선택할 때는 값의 범위뿐만 아니라 '정밀도'도 고려해야 한다.
만약 7자리 이상의 정밀도가 필요하다면 변수의 타입을 double로 해야 한다. double은 float보다 정밀도가 약 2배인 10진수로, 15자리 정밀도를 가지므로 float타입보다 훨씬 더 정밀한 값을 표현할 수 있다. 보통 실수형 값을 저장할 때 float타입이 아닌 double타입의 변수를 사용하는 경우는 대부분 저장하려는 '값의 범위' 때문이 아닌 '보다 높은 정밀도'가 필요해서 일 경우가 많다.
'Java > Basic' 카테고리의 다른 글
연산자 (0) | 2021.02.18 |
---|---|
형변환(Casting) (0) | 2021.02.17 |
화면 출력과 화면 입력 (0) | 2021.02.14 |
변수와 상수 (0) | 2021.02.13 |
객체지향의 개념과 클래스, 객체 (0) | 2021.01.18 |
댓글