자바의 기본 자료형 - 8 가지
- 정수형 : byte, short, int, long, char
- 소수형 : float, double
- 기타 : boolean
➡️ 정수형 타입별 숫자의 범위
➡️ 정수형 타입별 숫자의 범위 (2진수)
- byte는 8비트의 부호가 있는 타입이다. 부호가 있는 타입을 signed 타입이라고 한다.
7, 15, 31, 63은 수식으로 표현하면 $2^n - 1$ 로 표현할 수 있다.
n은 3부터 증가한다. 즉 7(=8-1), 15(=16-1), 31(=32-1), 63(=64 -1)
각 타입이 나타낼 수 있는 숫자의 범위가 2배씩 증가된다고 생각하면된다.
$2^7 \times 1 + 2^6 \times 1 + 2^5 \times 1 + 2^4 \times 1 + 2^3 \times 1 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 1 = 255$
byte의 범위 절반이다. 자바의 기본 자료형에 포함된 숫자들은 모두 부호가 있는 signed 타입들이다.
하지만 byte의 공간은 8개이다.
그럼 양수와 음수의 표현을 어떻게할까 ??
양수 음수 표현을 위해서 맨 앞에 있는 값이 0 이면 양수
, 1이면 음수
로 정했다.
따라서 $2^7$ 의 자리는 양수와 음수를 구분하기 위한 공간으로 쓰인다.
결론은 양수의 최대값은 $2^6 \times 1 + 2^5 \times 1 + 2^4 \times 1 + 2^3 \times 1 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 1 = 127$
이제 왜 byte의 범위가 127까지인지 알게되었다. 하지만 ….
음수의 범위는 -128
일까? …? 이론상 byte의 공간을 1로 채우면 -127이 되어야 한다. 하지만 -128?? 뭐지 ?
찾아보니….
그냥 생각하기에는 위의 값은 두개 다 0이다. 앞에 음수와 양수 구분하는 것을 제외하고 보면 그렇다.
하지만 실제로 다른 것이다.
위에 있는 모두 0으로 되어 있는 byte의 값은 실제로도 0이다. 하지만, 밑에 있는 맨 앞에만 1인 byte의 값은 0이 아니라 - 128이다.
다시 말하면, byte, short, int, long 타입의 가장 앞의 값만 1인 것은 해당 타입의 최소값이고, 두 번째 값부터 1로 채워져 있는 것은 해당 타입의 최대값이다.
절대값만으로 따지면, 최소값의 절대값이 최대값의 절대값보다 딱 1이 더 크다.
HOW? - byte 최대값에서 1을 더하면 ? byte 최소값에서 -1 을 빼면 ?
- 예시를 통해서 알아보자.
1 public class PrimitiveTypes{
2 public static void main(String[] args){
3 PrimitiveTypes tyeps = new PrimitiveTypes();
4 }
5
6 public void checkByte(){
7 byte byteMin = -128;
8 byte byteMax = 127;
9 System.out.println("byteMin=" + byteMin);
10 System.out.println("byteMax=" + byteMax);
1
12
13 byteMin = (byte)(byteMin - 1 );
14 byteMax = (byte)(byteMax + 1 );
15
16 System.out.println("byteMin - 1 = " + byteMin);
17 System.out.println("byteMax + 1 = " + byteMax);
18
19 }
20
21 }
22
우선 참고할 것부터 이야기해보자 . (byte)로 형변환하지 않으면 자바8 이후버전에서는 컴파일 에러가 뜬다. 하지만 자바 8 이전은 에러가 안남
그럼 이제 위에 코드의 결과 값을 확인해보자..
쿵짝짝 쿵짝짝 ~ 과연 !?
- 결과
byteMin = -128
byteMax = 127
byteMin - 1 = 127
byteMax + 1 = -128
무슨결과지…이게 ?
최소값에서 1을 더 뺀 것은 최대값이 나오고, 최대값에서 1을 더한 것은 최소값이 나왔다.
왜 그런 결과가 나왔지 ?
byte의 최소값 byteMin과 최대값byteMax을 2진수를 사용하는 비트로 표현
- byteMin의 값 → 2진수로 표현하면 1000_0000인 값에서 1을 빼면 0111_1111이 된다.
- byteMax의 값 → 2진수로 표현하면 0111_1111인 값에서 1을 더하면 1000_0000이 될 것이다.
그래서
byte의 최소값에서 1을 뺴면 최대값이 나오고 , byte의 최대값에서 1을 더하면 최소값이 나오는 결과를 맞이한다.
byte형은 왜 만들었을까?
int나 long 타입을 많이 쓰는데 byte은 왜 만들어서 쓰지도 않는걸까 ? 회사를 안간 내가 판단하긴 이르지만… 본 적이 정말 없다…
int, long타입처럼 큰 공간을 주고 사용하면 더 편리하지 않는가?
우리가 동영상, 이미지 등 저장할 때 저장데이터가 모두 int 타입일 경우를 생각해보자.
그러면 단순히 숫자 하나를 표현하기 위해서 32개의 0과 1을 표시하기 위한 공간이 필요하다. 즉, byte 대비 4배의 저장공간이 더 필요하게 되는 것이다.
그래서 ….. 많은 부분에서 데이터를 저장할 때 byte 값들을 조합해서 사용한다. 그래야 적은 공간에 보다 많은 내용을 저장할 수 있다.
오늘 한 것을 회고하며…
어떤 학습을 하고 이 지식이 내 지식이지 확인하는방법은 누군가에게 설명하므로 증명하는 것이다 라는 말이 있다.
평소에 “ 나 이거 알아 ! “ 라는 말을 했지만 설명을 못했다. 이제는 말이 앞서기 보다 행동으로 칠판을 가져다가 설명을 바로하자. 😋
오늘 한 것들은 정말 기초 적인 것이다. 그런데 머릿속으로 정리가 되어있지 않았던 것 같다. 이번 계기로 쭉 정리하고 잊어버리지말자… !
화이팅 하자 하루하루 꾸준히 ~