java datatype overflow(데이터 오버플로어)

java언어에서는 datatype(자료형)이라는 것이 존재한다. 자료형이란 변수에 저장 될 데이터의 형태를 지정하는 용도로 사용되며, 정수 실수 문자 논리 등등 다양한 형태로 존재한다. datatype overflow란 이 java에서 산술연산을 할 경우 해당 변수의 자료형의 표현 범위를 초과할 경우 쓰레기값이 발생되는 경우를 말한다.

1
2
3
4
5
//예제1
int a = 1000000;
int b = 1000000;
int c = a * b;
System.out.println(c); // 결과 : -727379968

정수형 int 변수 c에는 1000000000000 이라는 값이 저장되는 것이 아니라, -727379968라는 예상치 못한 값이 저장된다. 그 이유는 int가 표현할수 있는 정수값의 범위에 1000000000000 와 같이 큰 정수값이 저장될수 없기 때문이다. java의 자료형 범위는 다음과 같다.

data overflow

따라서 예제1의 경우 int보다 큰 long자료형을 사용하여 해결 할 수 있다.

1
2
3
4
5
//예제2
int a = 1000000;
int b = 1000000;
long c = a * b;
System.out.println(c); // 결과 : -727379968

최종으로 연산된 값이 저장될 c변수의 자료형을 int보다 큰 long으로 변경 했음에도 여전히 값은 -727379968라는 쓰래기 값이 저장된다. 실수하기 쉬운 부분인데 c는 long 타입이지만 c에 피연자인 a, b는 여전히 int이므로 결과적으로 c에는 예제1과 마찬가지로 쓰레기 값이 저장된다. 따라서 산술식의 피연산자중 최소 한개는 long 타입이어야 올바른 계산이 된다.

1
2
3
4
5
//예제3
int a = 1000000;
int b = 1000000;
long c = (long)a * b;
System.out.println(c); // 결과 : 1000000000000

산술로직을 사용할 경우 위와 같은 문제를 방어하기 위한 전용 산술 함수를 사용하는 편이 코딩에 효과 적일 것 같다.