Java 21에서 정수 /는 몫의 소수 부분을 버려 0을 향해 절삭합니다. 정수 %의 0이 아닌 나머지는 피제수와 같은 부호를 가지며, (a / b) * b + a % b == a 관계를 만족합니다.

음수 나눗셈에서 수학적 내림 몫이 필요하다면 /와 다른 Math.floorDiv를 검토합니다. 제수가 0인 경우에는 /와 % 모두 ArithmeticException이 발생합니다.

정수 나눗셈은 내림이 아니라 0 방향으로 절삭합니다

양수끼리 나누면 0 방향 절삭과 내림이 같은 결과라서 차이가 드러나지 않습니다. 음수가 섞이면 차이가 보입니다. 예를 들어 수학적으로 -7 / 3은 약 -2.333…입니다. Java의 정수 나눗셈은 소수 부분을 버려 -2를 만듭니다. 음수 쪽으로 더 내려가는 -3을 고르는 내림 연산과 다릅니다. Java Language Specification 21은 정수 몫이 0을 향해 반올림된다고 설명합니다. 나머지 연산은 그 몫과 함께 계산되며 0이 아닌 나머지의 부호는 피제수, 즉 나누어지는 수의 부호를 따릅니다. 따라서 -7 % 3은 -1입니다. -7 = (-2) × 3 + (-1)로 원래 수를 복원할 수 있습니다. 나머지가 언제나 양수라고 외우지 마세요.

피제수와 제수의 부호를 네 칸으로 나눠 계산합니다

Java 정수 연산은 몫의 부호와 나머지 부호를 따로 확인합니다
aba / ba % b검산 (a / b) × b + a % b
73212 × 3 + 1 = 7
7-3-21(-2) × (-3) + 1 = 7
-73-2-1(-2) × 3 + (-1) = -7
-7-32-12 × (-3) + (-1) = -7
Java 21에서 부호 네 조합을 출력하는 교육용 예제입니다. 현재 환경에는 Java 런타임이 없어 실행 결과를 검증하지 않았습니다.
public class DivisionTrace {
    public static void main(String[] args) {
        int[][] pairs = {{7, 3}, {7, -3}, {-7, 3}, {-7, -3}};
        for (int[] pair : pairs) {
            int a = pair[0];
            int b = pair[1];
            System.out.printf("%d / %d = %d, %% = %d%n", a, b, a / b, a % b);
        }
        System.out.println(Math.floorDiv(-7, 3));
        System.out.println(Math.floorMod(-7, 3));
    }
}

두 계산을 구분해 보세요. Java 연산자 -7 / 3은 -2이고 -7 % 3은 -1입니다. 반면 Math.floorDiv(-7, 3)은 아래쪽 정수인 -3을 돌려줍니다. 이 경우 대응하는 Math.floorMod(-7, 3)은 제수 쪽 부호를 따르는 2이며, floorDiv × 제수 + floorMod로도 -7을 복원합니다. 일반 %의 나머지와 floorMod를 한 규칙으로 섞지 마세요. Java 21 API 문서가 둘의 차이를 별도로 설명하는 이유입니다.

몫을 먼저 정하고 나머지를 식으로 검산합니다

  1. 문제의 언어와 자료형을 확인합니다. 여기서는 Java 21의 int 정수 연산을 다룹니다.
  2. 몫의 절삭 방향을 적용합니다. 소수 부분을 버려 0 쪽으로 이동합니다.
  3. 몫에 제수를 곱해 피제수와의 차이를 계산합니다. 그 차이가 나머지입니다.
  4. 나머지가 0이거나, 0이 아니라면 피제수와 부호가 같은지 확인합니다.
  5. (a / b) * b + a % b가 a와 일치하는지 마지막으로 검산합니다.

예를 들어 7 / -3은 -2입니다. 곱 (-2) × (-3)은 6이므로 7까지 남은 차이는 1입니다. 피제수 7이 양수이므로 나머지 1의 부호도 양수입니다. 표의 네 번째 줄도 같은 절차를 쓰면 -7 / -3의 몫은 2이고, 곱 2 × (-3)은 -6입니다. -7 - (-6) = -1이므로 나머지는 -1입니다. 피제수가 음수라 나머지도 음수입니다. 숫자를 식에 다시 대입하는 검산은 부호를 뒤집어 적은 실수를 찾는 데 유용합니다.

Math.floorDiv와 정수 최소값 예외를 따로 봅니다

가장 흔한 오답은 모든 음수 몫을 아래로 내린다고 가정하는 것입니다. -7 / 3을 -3으로 쓰면 Java의 /가 아니라 수학적 바닥 나눗셈을 적용한 셈입니다. 반대로 날짜 구간이나 버킷 계산에서 음수도 포함해 바닥 몫이 필요한 코드라면 Math.floorDiv가 목적에 맞을 수 있습니다. 그때 나머지 계산도 %와 동일하다고 간주하지 말고 Math.floorMod의 대응을 확인하세요. 예외도 문제의 범위를 정해 확인해야 합니다. Java에서 정수 제수가 0이면 나눗셈과 나머지 연산 모두 ArithmeticException을 던집니다. 또 가장 작은 표현 가능 정수를 -1로 나누는 특례에서는 오버플로가 발생하지만 JLS가 몫을 원래 피제수 값으로 정하며 예외를 던지지 않는다고 명시합니다. 일반적인 네 부호 연습에서는 이 경계값이 나오지 않으므로, 특례를 보통의 절삭 규칙과 분리해 기억하세요.

정답을 가리고 확인해 보세요

이 글을 위해 만든 학습 예시이며 공식 기출문제나 판매 카드의 인용이 아닙니다.

Java 21에서 -11 / 4와 -11 % 4를 계산하고 관계식으로 검산하세요. Math.floorDiv(-11, 4)와는 무엇이 다른가요?

정답과 해설 확인-11 / 4는 -2이고 -11 % 4는 -3입니다. (-2)×4+(-3)=-11이며, Math.floorDiv(-11,4)는 -3입니다.

정수 /는 0 방향으로 절삭하고 %의 0이 아닌 결과 부호는 피제수에서 옵니다. floorDiv는 음의 무한대 방향으로 내립니다.