Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 언더플로(Underflow) 발생 여부를 확인하는 방법

변수에 해당 자료형이 표현할 수 있는 최솟값보다 작은 값이 대입되면 언더플로(underflow)가 발생합니다. Java에서는 언더플로가 발생하더라도 JVM이 자동으로 예외를 던지지 않기 때문에, 프로그래머가 직접 이러한 상황을 감지하고 처리할 책임이 있습니다.

언더플로 확인 방법

int 타입끼리의 연산 결과가 최솟값을 벗어나는지 확인하려면, 피연산자를 더 넓은 범위의 자료형인 long으로 변환한 후 연산을 수행하고, 그 결과가 Integer.MIN_VALUE보다 작은지 검사하면 됩니다. 조건에 해당하면 ArithmeticException을 던져 언더플로 발생 사실을 명확하게 알릴 수 있습니다.

예제 코드

public class UnderflowTest {
    public static void main(String[] args) {
        int num1 = -2147483648;
        int num2 = -1;
        System.out.println("첫 번째 숫자: " + num1);
        System.out.println("두 번째 숫자: " + num2);
        // 연산 전에 long으로 변환하여 실제 결과값을 정확히 계산
        long sum = (long)num1 + (long)num2;
        if(sum < Integer.MIN_VALUE) {
            throw new ArithmeticException("언더플로가 발생했습니다!");
        }
        System.out.println("두 수의 합 : " + (int)sum);
    }
}

실행 결과

첫 번째 숫자: -2147483648
두 번째 숫자: -1
Exception in thread "main" java.lang.ArithmeticException: 언더플로가 발생했습니다!
        at UnderflowTest.main(UnderflowTest.java:10)

코드 설명

위 예제에서 num1은 int가 표현할 수 있는 최솟값인 -2147483648입니다. 여기서 -1을 더하면 이론적으로 -2147483649가 되어야 하지만, 이 값은 int 범위를 벗어나므로 언더플로가 발생합니다.

만약 두 값을 그대로 int로 연산했다면 결과는 최댓값인 2147483647로 잘못 반영되었을 것입니다. 따라서 연산 전에 (long)으로 캐스팅하여 실제 결과값을 정확히 구한 뒤, Integer.MIN_VALUE와 비교함으로써 언더플로 여부를 안전하게 판별할 수 있습니다.