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)로 원래 수를 복원할 수 있습니다. 나머지가 언제나 양수라고 외우지 마세요.
피제수와 제수의 부호를 네 칸으로 나눠 계산합니다
| a | b | a / b | a % b | 검산 (a / b) × b + a % b |
|---|---|---|---|---|
| 7 | 3 | 2 | 1 | 2 × 3 + 1 = 7 |
| 7 | -3 | -2 | 1 | (-2) × (-3) + 1 = 7 |
| -7 | 3 | -2 | -1 | (-2) × 3 + (-1) = -7 |
| -7 | -3 | 2 | -1 | 2 × (-3) + (-1) = -7 |
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 문서가 둘의 차이를 별도로 설명하는 이유입니다.
몫을 먼저 정하고 나머지를 식으로 검산합니다
- 문제의 언어와 자료형을 확인합니다. 여기서는 Java 21의 int 정수 연산을 다룹니다.
- 몫의 절삭 방향을 적용합니다. 소수 부분을 버려 0 쪽으로 이동합니다.
- 몫에 제수를 곱해 피제수와의 차이를 계산합니다. 그 차이가 나머지입니다.
- 나머지가 0이거나, 0이 아니라면 피제수와 부호가 같은지 확인합니다.
- (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는 음의 무한대 방향으로 내립니다.