Java에서 나눗셈 연산은 피연산자의 타입에 따라 완전히 다른 결과를 보여줌:
ArithmeticException 예외 발생Infinity 또는 NaN 반환Java는 IEEE 754 표준을 따라 부동소수점 연산을 처리함. 이 표준은 실수 연산에서 발생하는 특수 상황을 위해 Infinity와 NaN을 정의했음.
타입별 처리 방식:
public class IntegerDivision {
public static void main(String[] args) {
try {
int result = 5 / 0; // ArithmeticException 발생
} catch (ArithmeticException e) {
System.out.println("오류: " + e.getMessage()); // "/ by zero"
}
}
}
public class FloatingPointDivision {
public static void main(String[] args) {
System.out.println(5.0 / 0.0); // Infinity
System.out.println(-5.0 / 0.0); // -Infinity
System.out.println(0.0 / 0.0); // NaN
System.out.println(5.0 % 0.0); // NaN
}
}
public class SpecialValues {
public static void main(String[] args) {
double inf = Double.POSITIVE_INFINITY;
double nan = Double.NaN;
// Infinity: 비교 가능
System.out.println(inf > 1000); // true
System.out.println(Double.isInfinite(inf)); // true
// NaN: 자기 자신과도 같지 않음
System.out.println(nan == nan); // false (주의!)
System.out.println(Double.isNaN(nan)); // true (올바른 방법)
}
}
Infinity의 특징:
NaN의 특징:
NaN != NaN)// ❌ 잘못된 NaN 검사
if (result == Double.NaN) { /* 항상 false */ }
// ✅ 올바른 NaN 검사
if (Double.isNaN(result)) { /* 정상 동작 */ }
// ❌ 예외 처리 누락
public int divide(int a, int b) {
return a / b; // b가 0이면 프로그램 종료
}
// ✅ 안전한 처리
public int safeDivide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("0으로 나눌 수 없음");
}
return a / b;
}
// 안전한 나눗셈 함수
public static Double safeDivision(double a, double b) {
if (b == 0.0) {
return null; // 또는 기본값 반환
}
return a / b;
}
// 결과 검증
public static boolean isValidResult(double result) {
return !Double.isNaN(result) && !Double.isInfinite(result);
}
Java의 나눗셈 연산에서 발생하는 특수값들은 IEEE 754 표준에 따른 의도된 동작임.
핵심 포인트:
1. 정수 나눗셈: 반드시 예외 처리 필요
2. 실수 나눗셈: Double.isNaN(), Double.isInfinite() 활용
3. 방어적 프로그래밍: 나누기 전에 0 검사
4. NaN 비교: == 대신 Double.isNaN() 사용