Java 에서 숫자가 NaN 인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 부동 소수점 숫자가 "Not a Number" (NaN) 인지 확인하는 방법을 배우게 됩니다. Double.isNaN() 메서드를 살펴보고, 부동 소수점 연산을 통해 NaN 값이 생성되는 방식을 이해하며, NaN 검사 맥락에서 비 부동 소수점 입력을 처리하는 방법을 고려할 것입니다. 이 랩을 마치면 Java 프로그램에서 NaN 값을 안정적으로 감지하고 관리할 수 있게 됩니다.

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

이 단계에서는 Double.isNaN() 메서드를 사용하여 Java 에서 부동 소수점 숫자가 "Not a Number" (NaN) 인지 확인하는 방법을 배우겠습니다.

컴퓨터의 부동 소수점 숫자는 때때로 NaN 이라는 특수한 값을 생성할 수 있습니다. 이는 계산 결과가 정의되지 않거나 표준 숫자로 표현할 수 없을 때 발생합니다. 예를 들어, 0 을 0 으로 나누거나 음수의 제곱근을 구하면 NaN 이 발생할 수 있습니다.

프로그램에서 NaN 값을 감지할 수 있는 것이 중요합니다. 왜냐하면 NaN 값은 일반 숫자와 다르게 동작하기 때문입니다. 예를 들어, 표준 비교 연산자 (==, <, >) 를 사용하여 NaN 값을 다른 숫자 (다른 NaN 포함) 와 비교하면 항상 false가 됩니다.

Java 는 NaN 을 확인하기 위한 특정 메서드인 Double.isNaN()을 제공합니다. 이 메서드는 double 값을 입력으로 받아 값이 NaN 이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

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

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다.

  2. 기존 코드를 다음으로 바꿉니다.

    public class CheckNaN {
        public static void main(String[] args) {
            double result1 = 0.0 / 0.0; // This will result in NaN
            double result2 = 10.0 / 2.0; // This is a regular number
    
            System.out.println("Is result1 NaN? " + Double.isNaN(result1));
            System.out.println("Is result2 NaN? " + Double.isNaN(result2));
        }
    }
    

    이 코드에서:

    • 두 개의 double 변수 result1result2를 선언합니다.
    • result1에는 0.0 / 0.0의 결과가 할당되는데, 이는 부정형이므로 NaN 을 생성합니다.
    • result2에는 10.0 / 2.0의 결과가 할당되는데, 이는 표준 숫자 (5.0) 입니다.
    • 그런 다음 Double.isNaN()을 사용하여 result1result2가 NaN 인지 확인하고 결과를 출력합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 이제 이 새로운 프로그램을 컴파일해야 합니다. 클래스 이름을 CheckNaN으로 변경했으므로 CheckNaN.java를 컴파일해야 합니다. 터미널을 열고 다음을 실행합니다.

    javac CheckNaN.java
    

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

  5. 마지막으로, 컴파일된 프로그램을 실행합니다.

    java CheckNaN
    

    다음과 유사한 출력을 볼 수 있습니다.

    Is result1 NaN? true
    Is result2 NaN? false
    

    이 출력은 Double.isNaN()result1을 NaN 으로, result2를 일반 숫자로 올바르게 식별했음을 확인합니다.

Double.isNaN()을 사용하는 것이 Java 에서 NaN 값을 확인하는 올바르고 신뢰할 수 있는 방법입니다. 직접 비교 (== Double.NaN) 에 의존하는 것은 권장되지 않습니다. 앞서 언급했듯이 NaN == NaNfalse로 평가되기 때문입니다.

부동 소수점 연산으로 테스트

이 단계에서는 NaN 을 생성할 수 있는 부동 소수점 연산의 더 많은 예제를 살펴보고 Double.isNaN()을 사용하여 이를 확인하는 연습을 하겠습니다. 어떤 연산이 NaN 을 생성하는지 이해하는 것은 잠재적인 오류를 적절하게 처리하는 강력한 Java 코드를 작성하는 데 매우 중요합니다.

0 을 0 으로 나누는 것 외에도 무한대 또는 유효하지 않은 수학 함수와 관련된 다른 연산도 NaN 을 생성할 수 있습니다. Java 에는 양의 무한대와 음의 무한대 (Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY) 에 대한 특수한 표현이 있습니다.

CheckNaN.java 프로그램을 수정하여 이러한 몇 가지 경우를 테스트해 보겠습니다.

  1. WebIDE 편집기에서 CheckNaN.java 파일을 엽니다.

  2. 기존 코드를 다음으로 바꿉니다.

    public class CheckNaN {
        public static void main(String[] args) {
            double result1 = 0.0 / 0.0; // NaN
            double result2 = Math.sqrt(-1.0); // NaN (square root of a negative number)
            double result3 = Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY; // NaN
            double result4 = 10.0 / 0.0; // Positive Infinity
            double result5 = -10.0 / 0.0; // Negative Infinity
            double result6 = 5.0; // Regular number
    
            System.out.println("Is result1 NaN? " + Double.isNaN(result1));
            System.out.println("Is result2 NaN? " + Double.isNaN(result2));
            System.out.println("Is result3 NaN? " + Double.isNaN(result3));
            System.out.println("Is result4 NaN? " + Double.isNaN(result4));
            System.out.println("Is result5 NaN? " + Double.isNaN(result5));
            System.out.println("Is result6 NaN? " + Double.isNaN(result6));
        }
    }
    

    이 업데이트된 코드에서:

    • result1은 여전히 0.0 / 0.0입니다.
    • result2Math.sqrt(-1.0)을 사용하는데, 이는 실수에 대해 수학적으로 정의되지 않으며 NaN 을 생성합니다.
    • result3은 양의 무한대에서 양의 무한대를 빼는데, 이는 또 다른 부정형으로 NaN 을 생성합니다.
    • result4result5는 0 으로 나누기를 보여주는데, 이는 NaN 이 아닌 양의 또는 음의 무한대를 생성합니다.
    • result6은 비교를 위한 간단한 숫자입니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

    javac CheckNaN.java
    

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

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

    java CheckNaN
    

    다음과 유사한 출력을 볼 수 있습니다.

    Is result1 NaN? true
    Is result2 NaN? true
    Is result3 NaN? true
    Is result4 NaN? false
    Is result5 NaN? false
    Is result6 NaN? false
    

    이 출력은 Double.isNaN()이 NaN 을 생성하는 세 가지 연산을 올바르게 식별하는 동시에 무한대 값과 일반 숫자를 NaN 이 아닌 것으로 올바르게 식별했음을 보여줍니다.

이러한 다양한 부동 소수점 연산으로 테스트함으로써 NaN 이 언제 발생할 수 있는지, 그리고 프로그램에서 Double.isNaN()을 사용하여 이러한 경우를 처리하는 방법을 더 잘 이해할 수 있습니다.

부동 소수점이 아닌 입력 처리

이전 단계에서는 부동 소수점 연산이 어떻게 NaN 을 생성할 수 있는지에 중점을 두었습니다. 그러나 때로는 텍스트와 같이 유효한 숫자가 아닌 입력을 받을 수도 있습니다. 이러한 입력을 부동 소수점 숫자로 변환하려고 하면 문제가 발생할 수도 있습니다.

Double.isNaN()은 부동 소수점 계산의 결과를 확인하기 위한 것이지만, 초기 입력이 숫자로 구문 분석될 수 없는 경우도 처리하는 것이 중요합니다. Java 는 문자열을 숫자로 구문 분석하는 메서드를 제공하며, 이러한 메서드는 입력이 유효하지 않은 경우 예외를 발생시킬 수 있습니다.

사용자 입력을 double 로 구문 분석한 다음 구문 분석된 값이 NaN 인지 확인하는 새 프로그램을 만들어 보겠습니다.

  1. ~/project 디렉토리에 ParseAndCheck.java라는 새 파일을 만듭니다. 파일 탐색기에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택한 다음 ParseAndCheck.java를 입력하여 이 작업을 수행할 수 있습니다.

  2. WebIDE 편집기에서 ParseAndCheck.java 파일을 열고 다음 코드를 추가합니다.

    import java.util.Scanner;
    
    public class ParseAndCheck {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.print("Enter a floating-point number or an expression (e.g., 0.0/0.0): ");
            String input = scanner.nextLine();
    
            try {
                double value = Double.parseDouble(input);
    
                if (Double.isNaN(value)) {
                    System.out.println("The input resulted in NaN.");
                } else {
                    System.out.println("The input is a valid number: " + value);
                }
            } catch (NumberFormatException e) {
                System.out.println("Invalid input: Could not parse as a number.");
            } finally {
                scanner.close();
            }
        }
    }
    

    이 코드를 자세히 살펴보겠습니다.

    • 사용자 입력을 읽기 위해 Scanner 클래스를 가져옵니다.
    • 사용자에게 문자열을 입력하라는 메시지를 표시합니다.
    • 구문 분석 중에 발생할 수 있는 오류를 처리하기 위해 try-catch 블록을 사용합니다.
    • Double.parseDouble(input)은 입력 문자열을 double로 변환하려고 시도합니다. 문자열이 유효한 숫자 형식이 아닌 경우 (예: "hello") NumberFormatException을 발생시킵니다.
    • try 블록 내에서 구문 분석이 성공하면 Double.isNaN(value)를 사용하여 결과 double이 NaN 인지 확인합니다.
    • catch 블록은 NumberFormatException을 catch 하고 입력을 구문 분석할 수 없는 경우 오류 메시지를 출력합니다.
    • finally 블록은 스캐너가 닫히도록 합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

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

    java ParseAndCheck
    

    프로그램은 입력을 요청합니다. 다른 값을 입력해 보십시오.

    • 5.5를 입력합니다.

      Enter a floating-point number or an expression (e.g., 0.0/0.0): 5.5
      The input is a valid number: 5.5
      
    • 0.0/0.0을 입력합니다.

      Enter a floating-point number or an expression (e.g., 0.0/0.0): 0.0/0.0
      Invalid input: Could not parse as a number.
      

      (참고: parseDouble은 수학적 표현식을 직접 평가할 수 없습니다. 숫자의 문자열 표현만 구문 분석합니다.)

    • NaN을 입력합니다.

      Enter a floating-point number or an expression (e.g., 0.0/0.0): NaN
      The input resulted in NaN.
      
    • hello를 입력합니다.

      Enter a floating-point number or an expression (e.g., 0.0/0.0): hello
      Invalid input: Could not parse as a number.
      

이 단계에서는 유효한 숫자, 문자열 "NaN" 및 유효하지 않은 숫자 형식을 포함하여 다양한 유형의 입력을 처리하기 위해 입력 구문 분석과 Double.isNaN() 검사를 결합하는 방법을 보여줍니다. 이는 외부 소스에서 부동 소수점 숫자로 작업할 때 발생할 수 있는 잠재적인 문제를 처리하는 보다 완벽한 접근 방식입니다.

요약

이 랩에서는 Java 에서 부동 소수점 숫자가 "Not a Number" (NaN) 인지 확인하는 방법을 배웠습니다. NaN 은 정의되지 않거나 표현할 수 없는 계산의 결과로 나타나는 특수한 값이며, 표준 비교 연산자는 NaN 과 함께 안정적으로 작동하지 않는다는 것을 알게 되었습니다.

특히 Java 에서 NaN 값을 정확하게 감지하는 표준이자 권장되는 방법인 Double.isNaN() 메서드를 사용하는 데 중점을 두었습니다. NaN 과 일반 숫자 결과를 생성하는 부동 소수점 연산을 포함하는 예제를 통해 사용법을 시연했습니다.