java에서는 기본적으로 제공하는 8가지 기본 데이터타입(primitive type)이 있다.
- 정수 타입
- 메모리 사용 크키 : 1byte (8bit)
- 저장되는 값의 범위 : -128 ~ 127
위 그림에서 표현된 1byte(8bit)의 공간 중 가장 좌측의 최상위비트(부호비트)를 제외하고 나머지 7개의 비트에 0과 1로 이진수 표현이 가능하다.
7개로 구성된 이진수로 표현 가능한 값은 2^7 으로, 0 ~ 127이다, 이 때 가장 좌측의 최상위 비트가 0이면 양수로 인식한다.
가장 좌측이 최상위 비트가 1이면 음수로 인식하고 표현 가능한 범위는 -128 ~ -1 이다. 0은 양수에서 표현했으므로 음수에서 표현안해도 된다.
ex) 11111111 => -1, 10000000 => -128
이진수의 수와 음수 표현법
참고 : https://st-lab.tistory.com/189
- 정수 타입
- 메모리 사용 크기 : 2byte(16bit)
- 저장되는 값의 범위 : -32,768 ~ 32,767
범위 계산 방식은 byte와 동일
JVM의 피연산자 스택(Operand Stack)이 피연산자를 4Byte 단위로 저장하기 때문에 크기가 4byte보다 작은 자료형(byte, short)의 값을 계산할 때는 4byte로 변환하여 연산이 수행된다.
따라서 오히려 int형을 사용하는 것이 더 효율적이다.
- 정수타입
- 메모리 사용 크기 : 4byte(32bit)
- 저장되는 값의 범위 : -2,147,483,648 ~ 2,147,483,647
int 타입은 java에서 정수 연산을 하기 위한 기본타입이다.
- 정수타입
- 메모리 사용 크기 : 8byte(64bit)
- 저장되는 값의 범위 : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
long 타입은 int 타입의 저장 범위를 넘어서는 수치가 큰 데이터를 다룰 때 사용된다.
- 정수 타입
- 메모리 사용 크기 : 2byte(16bit)
- 저장되는 값의 범위 : 0 ~ 65535
char 타입은 문자를 저장하지만 java는 모든 문자를 유니코드로 처리하기 때문에 0 ~ 65535의 범위를 가진 정수 타입이다.
java에서 유일하게 제공되는 unsinged형태(음수가 존재하지 않음)로 가장 좌측 최상위 비트를 부호용으로 사용하지않는다.
char 형이 1111 1111 1111 1111
의 bit를 가지고 있을 때 10진수의 값 65535
short 형이 1111 1111 1111 1111
의 bit를 가지고 있을 때 10진수의 값 -1
char a = 'A'; b = 'B'; 일때 if (a > b)
가 가능한이유는
char 형은 유니코드 정수형태로 저장 char a = 'A' 일시 a변수에는 'A' 의 정수 값인 65가 들어감
- 실수 타입
- 메모리 사용 크기 : 4Byte(32bit)
- 저장되는 값의 범위 : -3.4E+38 ~ 3.4E+38
실수는 정수와 달리 부동 소수점 방식으로 저장된다.
부동소수점
하나의 실수를 가수와 지수 부분으로 나누어 소수점을 움직이면서 표현하는 방식이다.
대부분의 시스템에서는 실수를 IEEE 754 표준 부동 소수점 방식으로 표현하고 있다.
참고 : http://www.tcpschool.com/java/java_datatype_floatingPointNumber
실수 타입 float, double의 메모리 사용은 각각 정수 타입 int, long과 같지만, 부동 소수점 방식으로 저장되어 더 큰 범위의 값을 저장할 수 있다.
자바에서는 실수 연산은 기본적으로 double 타입으로 처리하므로 float 타입에 값을 저장하려면 실수 리터럴 뒤에 f 또는 F를 붙여야 한다.
float flovar1 = 3.14; // f 를 붙이지 않고 저장하면 컴파일 에러 발생!
float flovar2 = 3.14f; // 3.14 실수 리터럴이 저장된다.
- 실수 타입
- 메모리 사용 크기 : 8byte(64bit)
- 저장되는 값의 범위 : -1.7E+308 ~ 1.7E+308
float 타입은 소수점 아래 9자리 까지만 표현할 수 있는 반면, double 타입은 소수점 아래 18자리 까지도 표현할 수 있다.
부동 소수점 방식의 오차
고정 소수점 방식보다 표현 범위가 더 넓지만, 부동 소수점으로 표현하는 실수는 항상 오차가 존재하는 단점을 가지고 있다. 즉, 컴퓨터에서 실수를 표현할 때는 정확한 표현이 아닌 근사치를 표현하는 것이다.
double var = 0.1;
for(int i = 0; i < 1000; i++) {
var += 0.1;
}
System.out.println(var); // 100.09999999.. 가 출력된다.
java에서 실수연산 기본값을 double을 사용하는 이유?
java에서 실수값은 부동소수점 방식을 사용하다보니 오차가 발생할 수 밖에 없다.
그래서 정밀도 부분에서 double이 float보다 많은 자릿수를 표현할 수 있으므로 정밀도가 더 높아 java에서는 double을 기본값으로 사용한다.
참고 : https://devlog-wjdrbs96.tistory.com/254
- 논리 타입
- 메모리 사용 크기 : 1byte(8bit)
- 저장되는 값의 범위 : true 또는 false 단 2가지
조건문과 제어문의 실행 흐름 변경하는데 이용된다.