본문 바로가기

Java 공부/신용권의 이것이 자바다

오버플로우( Overflow)로 인해 잘못된 값이 산출되는 것을 막는 방법

반응형

연산을 했을 때, 결과 값이 지정된 타입의 범위를 넘을 경우에는 잘못된 값이 산출 될 수 있다.

예를 들어, 아래와 같은 연산식을 보자!

1000000*1000000을 실행해서 int값에 저장하려고 하니, 엉뚱한 결과가 나오는 것을 확인하게 될 것이다.

그것은 그 결과값이 int의 범위(-21억~+21억)를 넘어갔기 때문이다.

이럴 경우에는 애초에 x와 y의 타입을 long타입으로 변환해서 계산해야 한다.

다시, 코드를 보자!

 long타입으로 지정해서 계산을 하니, 결과값이 제대로 출력됨을 확인할 수 있을 것이다.

그러나 값이 정해져 있지 않고 누군가 입력할 때는 자유롭게 변환해서 계산할 수가 없다.

그것을 막기 위한 방법이 있다.

먼저, 런타임시 입력된 값일 경우에는 산술 연산자(+, -, *, /)를 직접 사용하지 않는 것이 좋다.

그리고 미리 메소드를 작성해서 오버플로우( Overflow)를 미리 조사한 뒤, '예외처리'를 해야 한다.

자바에서는 이것을 막아주는 'safeAdd 메소드'가 있다.

다음은  safeAdd메소드를 이용해 예외처리하는 코드이다.

위 코드에서처럼 20억+20억을 계산할 경우에 "오버플로우가 발생하여 정확하게 계산할 수 없음"이라는 결과를 출력한다.

그렇다면, int 범위내의 값을 넣었을 경우는 어떻게 나올까?

다음의 코드를 보자!

2만+2만을 넣으니까, 4만이라는 정확한 값이 계산됨을 확인하게 될 것이다.

이처럼 오버플로우를 막기 위해서는  sefeAdd메소드를 이용해서 미리 검사를 한 뒤,  올바른 값을 산출하도록 코드를 작성해야 한다. 

반응형