변수란 하나의 값을 저장할 수 있는 메모리 공간입니다.
변수에는 기본 자료형과 참조 자료형이 있습니다.
기본 자료형은 값 자체를 가지고 있는 변수를 의미하고 참조 자료형은 주소값을 가지고 있는 변수를 의미합니다.
오늘은 기본 자료형에 대해 알아보겠습니다.
기본 자료형 종류와 크기
JAVA의 기본형은 총 8가지로 byte, short, int, long, float, double, char, boolean이 있습니다.
종류/크기 | 1byte | 2byte | 4byte | 8byte |
정수형 | byte | short | int | long |
실수형 | float | double | ||
문자형 | char | |||
논리형 | boolean |
int와 double은 각각 정수형과 실수형의 default 타입입니다.
표현 범위
1byte = 8bit 이고, 1bit로 나타낼 수 있는 수는 0과 1, 두 가지입니다.
그러면 2bit로 나타낼 수 경우의 수는 몇일까요?
1bit | 1bit |
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
표와 같이 4가지, 즉 2^2입니다.
따라서 N-bit로 나타낼 수 있는 값의 개수는 2^N가지라고 생각하면 됩니다.
이 개념을 이용해서 크기를 이용해 각 타입의 범위를 구할 수 있습니다.
먼저, 정수부터 살펴보겠습니다.
정수
정수는 두 가지로 구분할 수 있습니다.
1. 부호가 없는 경우
2. 부호가 있는 경우
부호가 있냐 없냐는 음수의 유무로 따지면 됩니다.
부호가 있는 경우엔 부호 비트(1bit)를 생각해야 합니다.
우선 크기별로 n비트로 표현할 수 있는 값의 개수를 알아보겠습니다.
크기 | 값의 개수 |
1byte = 8bit | 2^8 = 256가지 |
2byte = 16bit | 2^16 = 65,536가지 |
4byte = 32bit | 2^32 = 4,294,967,296가지 |
8byte = 64bit | 2^64 = 18,446,744,073,709,551,616가지 |
부호가 없는 정수의 범위
부호가 없는 정수의 범위의 경우 0~ 시작하기 때문에 0~2^N-1로 표현할 수 있습니다.
크기 | 부호 없는 정수의 범위 |
|
1byte = 8bit | 0~2^8-1 | 0~255 |
2byte = 16bit | 0~2^16-1 | 0~65,535 |
4byte = 32bit | 0~2^32-1 | 0~4,294,967,295 |
8byte = 64bit | 0~2^64-1 | 0~18,446,744,073,709,551,615 |
부호가 있는 정수의 범위
부호가 있는 정수의 경우, 맨 앞 1bit를 부호 비트로 사용하게 됩니다.
부호 비트가 1이면 음수, 0이면 양수를 나타내게 됩니다.
범위를 구할 땐 부호 비트를 제외(2^(N-1))하고 구한 후, 음수 영역도 나타내면 됩니다.
byte 타입으로 예를 들면 다음과 같습니다.
크기 | 부호 있는 정수의 범위 | |
1byte = 8bit | -2^7 ~ (2^7)-1 | -128 ~ 127 |
2byte = 16bit | -2^15 ~ (2^15)-1 | -32768 ~ 32767 |
4byte = 32bit | -2^31 ~ (2^31)-1 | 2^31 = (2^10)^3 * 2 2^10 = 1024 => 약 10^3 (10^3)^3 * 2 = 10^9 * 2 => 약 20억 -20억 ~ 20억 |
8byte = 64bit | -2^63 ~ (2^63)-1 | 2^63 = 2^3 * 2^60 => 약 2^3 * (10^3)^6 2^3 * 10^18 => 약 800경 -800경 ~ 800경 |
실수
실수는 부동소수점을 이용해서 표현합니다.
2진수로는 소수를 정확하게 표현할 수 없기 때문에 중간에 표현할 수 없는 범위가 존재합니다.
범위를 계산하는 방법이 존재하지만, 부동 소수점에 대해 이해해야 하기때문에 여기선 범위만 나타내겠습니다.
종류 | 실수의 범위 |
float | -3.4*10^38 ~ -1.4*10^-45, 1.4*10^-45 ~ 3.4*10^38 |
double | -4.9*10^-324 ~ -1.8*10^308, 1.8*10^308 ~ 4.9*10^-324 |
위에서는 byte 크기를 기준으로 범위를 구했기 때문에 헷갈릴 수 있어서 하나로 정리해보겠습니다.
종류 | 타입 | 범위 |
논리형 | boolean | 1byte지만, 0 or 1로만 나타냄 |
문자형 | char | 2byte, 부호가 없음 => 0~65,535 |
정수형 | byte | 1byte, 부호가 있음 => -128 ~ 127 |
short | 2byte, 부호가 있음 => -32768 ~ 32767 | |
int | 4byte, 부호가 있음 => 대략 -20억 ~ 20억 | |
long | 8byte, 부호가 있음 => 대략 -800경 ~ 800경 | |
실수형 | float | 4byte, -3.4*10^38 ~ -1.4*10^-45, 1.4*10^-45 ~ 3.4*10^38 |
double | 8byte, -4.9*10^-324 ~ -1.8*10^308, 1.8*10^308 ~ 4.9*10^-324 |
따라서 자료형의 크기만 안다면, 실수를 제외하고는 범위를 구할 수 있습니다.
범위를 알고 있으면 변수를 선택할 때 도움이 됩니다.
특히 int형은 자주 쓰이기 때문에 수가 크더라도 대략 -+20억이라고 생각하고 있으면 이해하기 쉽습니다.
잘못된 정보가 있거나, 다른 의견이 있으시다면 피드백 부탁드립니다. 감사합니다 :)
'IT > JAVA' 카테고리의 다른 글
부동 소수점과 JAVA 실수형(float, double)의 오차 해결에 대해서 (0) | 2022.03.04 |
---|---|
인터페이스(Interface)와 추상 클래스(abstract class) 비교 및 사용 시기에 대해서 (0) | 2022.02.28 |
GC (Garbage Collection)의 동작 방식에 대해서 (0) | 2022.02.25 |
JVM의 메모리 구조에 대해서 (2) | 2022.02.23 |