자료형의 범위를 넘으면?

2021. 5. 15. 23:54Java/Practice

 
데이터 자료형의 범위는 어떻게 구해지며 범위는 어떻게 계산되는 것일까??

 

데이터 자료형은 여러 가지가 존재하지만 확인하기 편한 정수형 자료형을 가지고서 확인해 보자.

자세한 데이터 유형 JAVA 변수(Variable) 및 데이터 유형(Data Type)을 참고.

 

음수를 포함한 정수형 자료형의 범위의 표현은 2의 보수 (Two`s complement)의 표현 범위로 나타내는데 이것 역시 프로그램에서 음수 표현 방식 여기를 참고하면 된다.

 

각설하고, 데이터의 표현 범위는 -2n-1 ~ 2n-1-1 이다. (n은 bit 단위(1byte = 8bit)로 계산)

자료형 메모리 계산식 정수 표현 범위
byte 1 Byte (8bit) -27 ~ 27-1 -128 ~ 127
short 2 Byte (16bit) -215 ~ 215-1 -32768 ~ 32767
int 4 Byte (32bit) -231 ~ 231-1 -2147483648 ~ 2147483647
long 8 Byte (64bit) -263 ~ 263-1 -922337036854775808 ~ 9223372036854775807

 

만약 각각 자료형의 정수 표현 범위를 넘어가면 어떻게 될까??
-128에 -1을 해서 -129 되거나 127에 +1을 해서 128이 되면 byte 값은 어떻게 될까?

 

결과부터 확인해 보자!!

byte byteValue  = 128;	//참고로 직접대입은 안됨 - 오류발생!!
byte byteMax = Byte.MAX_VALUE;		// 127
System.out.println( ++byteMax );	// 결과값 : -128
byte byteMin = Byte.MIN_VALUE;		// -128
System.out.println( --byteMin );	// 결과값 : 127

위에서 보는 것처럼 연산을 하게 되면 표현 범위를 넘어 오류가 날 줄 알았던 것과는 반대로 정상적으로 byte 값이 출력되는 것을 확인할 수 있다.

 

특이한 점은 결괏값이 다르게 나온 것인데 이것은 2진수로 계산해 보면 확인할 수 있다.

1) byte최댓값(127)에 1을 더한 경우

   0111 1111 (127)
+ 0000 0001 (1)

--------------------------

= 1000 0000 (-128)

 

이건 OK!!

2) byte최솟값(-128)에 1을 뺀 경우

참고로 프로그램에서 뺄셈 연산은 존재하지 않기 때문에 2의 보수를 통한 덧셈 연산으로 계산함

   1000 0000 (-128)

+ 1111 1111 (-1)

--------------------------

= 1 0111 1111 (127?)

 

이건 먼가 이상하다 8Bit를 넘어갔는데??

이 부분은 형 변환(casting)과 연관되어 byte의 단위인 8bit까지만 가지고 판단하기 때문에 0111 1111 = 127이 되는 것이다.

형 변환 시 주의해야 할 사항이기도 한데 큰 자료형을 작은 자료형으로 형 변환 시에는 값이 정상적으로 입력되지 않을 수 있다.

 

결론적으로,
각 자료형에 무한대로 + 또는 - 연산을 하게 되면
결국 표현 범위를 무한적으로 도는 것이라는 걸 알 수 있다.

 

실제로 각 자료형의 데이터 범위 초과로 오류는 나지 않고 값만 변경되기 때문에 디버깅이 어려우며 일일이 값을 확인하면서 디버깅해야 하는 부분이 발생함으로 이 부분을 고려해서 데이터 선언을 해서 사용해야 한다.

'Java > Practice' 카테고리의 다른 글

Java Collection 빠르게 사용하기 ( feat. Big O )  (0) 2021.10.15