Java 에서 숫자가 무한대인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 double 값이 양의 무한대 또는 음의 무한대를 나타내는지 확인하는 방법을 배우게 됩니다. 이는 0 으로 나누기와 같이 표준 수치 범위를 벗어나는 결과를 생성할 수 있는 부동 소수점 계산을 처리할 때 중요한 기술입니다.

실습을 통해 Double.isInfinite() 메서드를 사용하여 무한대 값을 식별하고, 0 으로 나누기가 어떻게 무한대로 이어질 수 있는지 탐구하며, 무한대 값과 NaN (Not-a-Number) 의 차이점을 이해하게 됩니다.

Double.isInfinite() 를 사용하여 확인

이 단계에서는 Java 에서 double 값이 양의 무한대 또는 음의 무한대를 나타내는지 확인하는 방법을 배우겠습니다. 이는 0 으로 나누기와 같이 부동 소수점 숫자의 정상 범위를 벗어나는 값을 초래할 수 있는 계산을 처리할 때 특히 유용합니다.

Java 는 이를 위해 Double 클래스에 isInfinite()라는 내장 메서드를 제공합니다.

Double.isInfinite()를 사용하는 방법을 보여주는 간단한 Java 프로그램을 만들어 보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다 (아직 열려 있지 않은 경우). ~/project 디렉토리에 있어야 합니다.

  2. 파일의 전체 내용을 다음 코드로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            double positiveInfinity = Double.POSITIVE_INFINITY;
            double negativeInfinity = Double.NEGATIVE_INFINITY;
            double finiteNumber = 10.0;
    
            System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));
            System.out.println("Is negativeInfinity infinite? " + Double.isInfinite(negativeInfinity));
            System.out.println("Is finiteNumber infinite? " + Double.isInfinite(finiteNumber));
        }
    }

    이 코드의 새로운 부분을 살펴보겠습니다.

    • double positiveInfinity = Double.POSITIVE_INFINITY;: 이 줄은 double 변수를 선언하고 양의 무한대를 나타내는 특수 값을 할당합니다.
    • double negativeInfinity = Double.NEGATIVE_INFINITY;: 이 줄은 double 변수를 선언하고 음의 무한대를 나타내는 특수 값을 할당합니다.
    • double finiteNumber = 10.0;: 이는 유한 값을 가진 일반 double 변수를 선언합니다.
    • System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));: 이 줄은 positiveInfinity를 인수로 사용하여 Double.isInfinite() 메서드를 호출합니다. 이 메서드는 값이 무한대 (양수 또는 음수) 이면 true를 반환하고 그렇지 않으면 false를 반환합니다. 그런 다음 결과가 콘솔에 출력됩니다.
    • 다음 두 개의 System.out.println 줄은 negativeInfinityfiniteNumber에 대해 동일한 작업을 수행합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 이제 프로그램을 컴파일해 보겠습니다. WebIDE 하단의 터미널을 열고 ~/project 디렉토리에 있는지 확인합니다. 다음 명령을 실행합니다.

    javac HelloJava.java

    컴파일이 성공하면 아무런 출력도 표시되지 않습니다.

  5. 마지막으로 java 명령을 사용하여 컴파일된 프로그램을 실행합니다.

    java HelloJava

    다음과 유사한 출력이 표시됩니다.

    Is positiveInfinity infinite? true
    Is negativeInfinity infinite? true
    Is finiteNumber infinite? false

    이 출력은 Double.isInfinite()가 양의 무한대와 음의 무한대를 모두 올바르게 식별하는 동시에 일반 유한 숫자에 대해 false를 반환함을 확인합니다.

0 으로 나누기 테스트

이전 단계에서 Double.isInfinite()가 미리 정의된 무한대 값으로 어떻게 작동하는지 살펴보았습니다. 이제 계산에서 무한대가 발생할 수 있는 일반적인 시나리오인 0 으로 나누기를 살펴보겠습니다.

표준 산술에서 0 으로 나누기는 정의되지 않습니다. 그러나 부동 소수점 산술 (double 이 사용하는) 에서 0 이 아닌 숫자를 0 으로 나누면 분자의 부호에 따라 양의 무한대 또는 음의 무한대가 발생합니다. 0 을 0 으로 나누거나 무한대를 무한대로 나누면 "Not a Number" (NaN) 라는 특수한 값이 발생하며, 이는 다음 단계에서 다룰 것입니다.

0 으로 나누기를 시연하고 Double.isInfinite()를 사용하여 결과를 확인하도록 프로그램을 수정해 보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다. ~/project 디렉토리에 있어야 합니다.

  2. 현재 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            double positiveResult = 10.0 / 0.0;
            double negativeResult = -10.0 / 0.0;
            double zeroResult = 0.0 / 10.0;
    
            System.out.println("Result of 10.0 / 0.0: " + positiveResult);
            System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveResult));
    
            System.out.println("Result of -10.0 / 0.0: " + negativeResult);
            System.out.println("Is -10.0 / 0.0 infinite? " + Double.isInfinite(negativeResult));
    
            System.out.println("Result of 0.0 / 10.0: " + zeroResult);
            System.out.println("Is 0.0 / 10.0 infinite? " + Double.isInfinite(zeroResult));
        }
    }

    이 새로운 코드에서 일어나는 일은 다음과 같습니다.

    • double positiveResult = 10.0 / 0.0;: 양수 (10.0) 를 0(0.0) 으로 나눕니다. 부동 소수점 산술에서 이것은 양의 무한대를 초래합니다.
    • double negativeResult = -10.0 / 0.0;: 음수 (-10.0) 를 0(0.0) 으로 나눕니다. 이것은 음의 무한대를 초래합니다.
    • double zeroResult = 0.0 / 10.0;: 0(0.0) 을 0 이 아닌 숫자 (10.0) 로 나눕니다. 이것은 0 을 초래하며, 이는 유한한 숫자입니다.
    • 그런 다음 이러한 나눗셈의 결과를 출력하고 Double.isInfinite()를 사용하여 각 결과가 무한대인지 확인합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 터미널에서 수정된 프로그램을 컴파일합니다.

    javac HelloJava.java

    다시, 출력이 없으면 컴파일이 성공했음을 나타냅니다.

  5. 프로그램을 실행합니다.

    java HelloJava

    다음과 유사한 출력이 표시됩니다.

    Result of 10.0 / 0.0: Infinity
    Is 10.0 / 0.0 infinite? true
    Result of -10.0 / 0.0: -Infinity
    Is -10.0 / 0.0 infinite? true
    Result of 0.0 / 10.0: 0.0
    Is 0.0 / 10.0 infinite? false

    이것은 0 이 아닌 부동 소수점 숫자를 0 으로 나누면 무한대 (양수 또는 음수) 가 올바르게 생성되고 Double.isInfinite()가 이러한 결과를 정확하게 식별함을 보여줍니다. 0 을 0 이 아닌 숫자로 나누면 0 이 되며, 이는 무한대가 아닙니다.

무한대 (Infinite) 와 NaN 구분하기

이전 단계에서 Double.isInfinite()에 대해 배우고 0 으로 나누기가 어떻게 무한대를 초래할 수 있는지 배웠습니다. 그러나 부동 소수점 산술에는 "Not a Number"를 의미하는 NaN 이라는 또 다른 특수 값이 있습니다. NaN 은 0 을 0 으로 나누거나 음수의 제곱근을 구하는 것과 같이 정의되지 않거나 표현할 수 없는 연산의 결과를 나타냅니다.

무한대 값과 NaN 을 구별할 수 있는 것은 서로 다른 유형의 예외적인 결과를 나타내기 때문에 중요합니다. Java 는 double 값이 NaN 인지 확인하기 위해 Double.isNaN() 메서드를 제공합니다.

NaN 을 초래하는 계산을 포함하고 이를 무한대와 구별하는 방법을 확인하기 위해 프로그램을 마지막으로 수정해 보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다. ~/project 디렉토리에 있어야 합니다.

  2. 현재 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            double positiveInfinity = 10.0 / 0.0;
            double nanResult = 0.0 / 0.0;
            double finiteNumber = 5.0;
    
            System.out.println("Result of 10.0 / 0.0: " + positiveInfinity);
            System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveInfinity));
            System.out.println("Is 10.0 / 0.0 NaN? " + Double.isNaN(positiveInfinity));
    
            System.out.println("Result of 0.0 / 0.0: " + nanResult);
            System.out.println("Is 0.0 / 0.0 infinite? " + Double.isInfinite(nanResult));
            System.out.println("Is 0.0 / 0.0 NaN? " + Double.isNaN(nanResult));
    
            System.out.println("Result of 5.0: " + finiteNumber);
            System.out.println("Is 5.0 infinite? " + Double.isInfinite(finiteNumber));
            System.out.println("Is 5.0 NaN? " + Double.isNaN(finiteNumber));
        }
    }

    변경 사항에 대한 분석은 다음과 같습니다.

    • double positiveInfinity = 10.0 / 0.0;: 양의 무한대를 초래하는 나눗셈을 유지합니다.
    • double nanResult = 0.0 / 0.0;: 이 줄은 0 을 0 으로 나누는 연산을 수행하며, 이는 NaN 을 초래합니다.
    • double finiteNumber = 5.0;: 비교를 위한 일반적인 유한 숫자입니다.
    • 이제 Double.isInfinite() 외에도 각 결과에 대해 Double.isNaN()에 대한 호출을 포함합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 터미널에서 프로그램을 컴파일합니다.

    javac HelloJava.java
  5. 프로그램을 실행합니다.

    java HelloJava

    다음과 유사한 출력이 표시됩니다.

    Result of 10.0 / 0.0: Infinity
    Is 10.0 / 0.0 infinite? true
    Is 10.0 / 0.0 NaN? false
    Result of 0.0 / 0.0: NaN
    Is 0.0 / 0.0 infinite? false
    Is 0.0 / 0.0 NaN? true
    Result of 5.0: 5.0
    Is 5.0 infinite? false
    Is 5.0 NaN? false

    이 출력은 무한대 값과 NaN 의 차이점을 명확하게 보여줍니다. Double.isInfinite()는 양수 또는 음의 무한대에 대해서만 true를 반환하는 반면, Double.isNaN()는 NaN 에 대해서만 true를 반환합니다. 유한 숫자의 경우 두 메서드 모두 false를 반환합니다. 이 구분을 이해하는 것은 부동 소수점 계산에서 잠재적인 오류와 예상치 못한 결과를 처리하는 데 매우 중요합니다.

요약

이 랩에서는 Java 에서 double 값이 Double.isInfinite() 메서드를 사용하여 양의 무한대 또는 음의 무한대를 나타내는지 확인하는 방법을 배웠습니다. 미리 정의된 Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY 값과 유한 숫자를 사용하여 이 메서드를 사용하는 방법을 살펴보고 동작을 이해했습니다. 이 메서드는 부동 소수점 계산에서 잠재적인 무한대 결과를 처리하는 데 중요합니다.