HOWTO · Java

Java의 정수 나눗셈

Java에서 정수 나눗셈이 몫을 계산하는 방식과 나머지, 부동 소수점 결과를 얻는 방법, 0으로 나눌 때의 주의점을 설명합니다.

이 페이지의 내용

Java의 정수 나눗셈은 정수 몫을 반환하며, 소수 부분을 0 방향으로 버립니다. 두 피연산자가 int이면 10 / 9는 1, 10 / 19는 0입니다. Java는 몫을 반올림하지 않습니다. 나머지는 %로 구하고, 소수 결과가 필요하면 나누기 전에 한 피연산자를 double로 변환하세요.

정수 나눗셈의 기본

다음 Java 프로그램은 네 쌍의 int 값으로 나눈 몫을 출력합니다.

public class IntegerDivision {
    public static void main(String[] args) {
        int first = 10 / 9;
        int second = -10 / 9;
        int third = 10 / -9;
        int fourth = 10 / 19;

        System.out.println(first);
        System.out.println(second);
        System.out.println(third);
        System.out.println(fourth);
    }
}
1
-1
-1
0

0이 아닌 피연산자 중 정확히 하나가 음수이면 몫은 음수입니다. 10 / 19처럼 양수 몫이 1보다 작으면 0이 됩니다. -10 / 19도 0 방향으로 버리므로 0입니다. 분자가 0이면 0이 아닌 어떤 제수로 나누어도 몫은 0입니다.

나머지 연산자로 나머지 처리하기

% 연산자는 정수 나눗셈의 나머지를 반환합니다. 계산에서 몫과 나머지가 모두 필요하면 /와 %를 함께 사용하세요. Java에서 부호가 있는 정수 피연산자를 사용할 때 나머지는 0이거나 피제수(왼쪽 피연산자)와 같은 부호를 가집니다.

public class QuotientAndRemainder {
    public static void main(String[] args) {
        int dividend = -10;
        int divisor = 3;
        int quotient = dividend / divisor;
        int remainder = dividend % divisor;

        System.out.println("Quotient: " + quotient);
        System.out.println("Remainder: " + remainder);
    }
}
Quotient: -3
Remainder: -1

두 값은 dividend == quotient * divisor + remainder를 만족합니다. 여기서는 -10 == (-3 * 3) + (-1)입니다. 예를 들어 number % 2 == 0을 확인하면 정수가 짝수인지 판별할 수 있습니다. Java의 %를 흔히 모듈로 연산자라고 부르지만, 음수에서는 부호가 있는 나머지를 반환한다는 점을 기억하세요.

정밀도를 위한 형 변환

소수 몫을 얻으려면 / 연산이 평가되기 전에 적어도 한 피연산자를 float 또는 double로 변환해야 합니다. 형 변환으로 연산이 부동 소수점 나눗셈으로 바뀝니다.

public class FloatingPointDivision {
    public static void main(String[] args) {
        int numerator = 5;
        int denominator = 2;
        double result = (double) numerator / denominator;

        System.out.println(result);
    }
}
2.5

나눗셈 전에 형 변환이 적용되므로 5는 double로 취급되고 몫의 소수 부분이 보존됩니다. 반대로 (double) (5 / 2)처럼 나눈 뒤 형 변환하면 이미 계산된 정수 2만 2.0으로 바뀝니다. 버려진 소수 부분은 되살릴 수 없습니다. float와 double은 유한한 이진 정밀도를 사용하므로 많은 십진 소수를 근삿값으로 표현합니다. 일반적인 계산에는 보통 double을 사용하고, 출력되는 소수 자릿수가 항상 일정하다고 가정하지 마세요. 금액처럼 정확한 십진 연산이 필요하면 명시적인 소수 자릿수와 반올림 정책을 지정해 BigDecimal을 사용하세요.

정수 나눗셈에서 흔히 발생하는 문제

정수 제수를 0으로 나누면 ArithmeticException이 발생합니다. 나누기 전에 제수를 확인하거나, 확인하기 어려운 경우 예외를 처리하세요. 예를 들면 다음과 같습니다.

public class SafeDivision {
    public static void main(String[] args) {
        int numerator = 10;
        int denominator = 0;

        if (denominator == 0) {
            System.out.println("Cannot divide by zero.");
        } else {
            System.out.println(numerator / denominator);
        }
    }
}
Cannot divide by zero.

denominator가 입력값이나 계산 결과일 때 이런 검사가 유용합니다. 정수를 0으로 나누면 대입이 완료되기 전에 예외가 발생합니다. 부동 소수점 나눗셈은 규칙이 다릅니다. double 또는 float를 0으로 나누면 이 정수 ArithmeticException 대신 무한대 또는 NaN이 나오므로, 애플리케이션에서 의미 없는 값이라면 결과를 확인해야 합니다.

정수 범위의 한계도 예상 밖의 결과를 만들 수 있습니다. Integer.MIN_VALUE / -1은 int 범위를 넘치며 Integer.MIN_VALUE로 계산됩니다. Java는 이 오버플로에 대해 예외를 던지지 않습니다. 자료형의 한계에 가까운 값이 들어올 수 있다면 더 넓은 자료형을 선택하거나 몫에 의존하기 전에 범위를 검증하세요.

결론

Java의 정수 나눗셈에서 /는 0 방향으로 버리고 %는 부호가 있는 나머지를 반환합니다. 부동 소수점 몫을 얻으려면 나누기 전에 피연산자를 변환하고, 정수 제수가 0인지 확인하세요.

자주 묻는 질문

int를 0으로 나누면 어떻게 되나요?
Java는 ArithmeticException을 던집니다. 제수를 먼저 확인하거나 예외를 처리하세요.

소수 결과는 어떻게 얻나요?
/를 적용하기 전에 피연산자 하나 이상을 double 또는 float로 변환하세요.

나머지는 어떻게 구하나요?
%를 사용하세요. 예를 들면 int remainder = dividend % divisor;와 같습니다.

반복문에서 정수 나눗셈을 사용해도 되나요?
네. 정수 나눗셈은 매번 0 방향으로 버립니다. 반복문 계산에 소수 부분이 필요하면 부동 소수점 피연산자를 사용하세요.