티스토리 뷰

개발/자바

Divide by Zero === Exception?? Really??

까매요~ ccambo 2017.03.28 12:29

Divide by Zero === Exception?? Really?

흔히 산술연산을 처리할 때 0으로 나누면 Divide by Zero Exception 이 발생한다고 알고 있다. 실제 연산 샘플을 구성해 봐도 실제 Exception 이 발생한다.

public static void main (String[] args) throws java.lang.Exception
{
    int aa = 100 / 0;
}

위의 코드는 Exception in thread "main" java.lang.ArithmeticException: / by zero 예외가 발생한다.

정말 모든 산술 연산이 이렇게 적용될까??? Really??

책이나 관련된 정보를 찾아보면 보통 정수를 0으로 나누면 이라는 전제 조건이 있다.

그럼 정수가 아닌 경우는 어떻게 될까?

  • 0 이 아닌 부동 소수점 값을 0 으로 나누면 부호 있는 Infinity 가 되고 예외는 발생하지 않는다.
    • 1.0 / 0.0 은 Positive-Infinity 가 된다.
    • -1.0 / 0.0 은 Negative-Infinity 가 된다.
  • 0 이 아닌 정수를 정수 0 으로 나누면 ArithmeticException 이 발생한다.

음!! 위와 같이 정리할 수 있다.

그런데 0.0 / 0.0 은 뭐가 나올까?

결론은 isNaN 상태가 된다. 즉, 연산 불가라고 봐야 한다.

이런 상황은 실제 변수나 VO 등에 Assign 할 경우에는 예외가 없으니 큰 문제가 없지만 JSON 으로 변환하는 등의 작업을 진행하면 뜬금없이 "Infinity", "isNaN" 과 같은 값을 만나게 된다.

  • 어디서 저런 값이 나오는지 모르겠다.
  • 내가 만든 코드에서는 문자열 처리한 적이 없다.
  • 문자열이 Float, Double,.. 등의 자료형에 입력되면 오류가 발생하기 때문에 내가 만든 코드 문제가 아니다.
  • ...

대략 이런 반응들이 나올 듯 하다. ㅠㅠ

그럼 아래과 같은 코드는 어떤 결과를 보여줄까? 예외는 발생할까?

public static void main (String[] args) throws java.lang.Exception
{
    Float aa = 100.0F / 0F;
    Double bb = 100.0D / 0D;
    int cc = (int)(100.0F / 0);
}

결과를 한번씩 확인해 보면 위에서 정리한 내용을 알 수 있고 결과 값을 보면 왜???..... 또 다른 미지의 세계로 검색을 떠나게 될 것이다. ^^

이를 기반으로 다양한 상황에 적용해서 오류 없는 코드를 만들어 보도록 하자.!!!


References

- http://www.w3resource.com/java-tutorial/java-arithmetic-operators.php

Written by Morris (ccambo@gmail.com - MSFL)

댓글
댓글쓰기 폼