[Java] 3. 나눗셈 연산 후 NaN과 Infinity 처리

김정란·2025년 5월 26일

Java

목록 보기
3/7

📋 목차

  1. 결론
  2. 개념 정의
  3. 핵심 동작 원리
  4. 주의사항 및 팁
  5. 마무리

1. 🎯 결론

Java에서 나눗셈 연산은 피연산자의 타입에 따라 완전히 다른 결과를 보여줌:

  • 정수 나눗셈: 0으로 나누면 ArithmeticException 예외 발생
  • 실수 나눗셈: 0으로 나누면 Infinity 또는 NaN 반환

2. 📚 개념 정의

Java는 IEEE 754 표준을 따라 부동소수점 연산을 처리함. 이 표준은 실수 연산에서 발생하는 특수 상황을 위해 InfinityNaN을 정의했음.

타입별 처리 방식:

  • 정수 연산: 수학적으로 명확한 결과만 허용 (예외로 처리)
  • 실수 연산: 특수값으로 무한대나 정의되지 않은 값도 표현

3. 🔍 핵심 동작 원리

3.1 정수 나눗셈

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"
        }
    }
}

3.2 실수 나눗셈

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
    }
}

3.3 Infinity vs 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의 특징:

  • 비교 가능: 다른 수보다 항상 크거나 작음
  • 연산 결과 예측 가능: 대부분의 연산에서 Infinity 유지
  • 의미: "매우 큰 값" 또는 "매우 작은 값"을 나타냄

NaN의 특징:

  • 비교 불가능: 자기 자신과도 같지 않음 (NaN != NaN)
  • 전염성: NaN과의 모든 연산 결과는 NaN
  • 의미: "정의되지 않은 수학적 연산"을 나타냄

4. ⚠️ 주의사항 및 팁

4.1 일반적인 실수

// ❌ 잘못된 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;
}

4.2 실무 활용 팁

// 안전한 나눗셈 함수
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);
}

5. 📖 마무리

Java의 나눗셈 연산에서 발생하는 특수값들은 IEEE 754 표준에 따른 의도된 동작임.

핵심 포인트:
1. 정수 나눗셈: 반드시 예외 처리 필요
2. 실수 나눗셈: Double.isNaN(), Double.isInfinite() 활용
3. 방어적 프로그래밍: 나누기 전에 0 검사
4. NaN 비교: == 대신 Double.isNaN() 사용

0개의 댓글