소개
이 랩에서는 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 프로그램을 만들어 보겠습니다.
WebIDE 편집기에서
HelloJava.java파일을 엽니다.기존 코드를 다음으로 바꿉니다.
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변수result1과result2를 선언합니다. result1에는0.0 / 0.0의 결과가 할당되는데, 이는 부정형이므로 NaN 을 생성합니다.result2에는10.0 / 2.0의 결과가 할당되는데, 이는 표준 숫자 (5.0) 입니다.- 그런 다음
Double.isNaN()을 사용하여result1과result2가 NaN 인지 확인하고 결과를 출력합니다.
- 두 개의
파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
이제 이 새로운 프로그램을 컴파일해야 합니다. 클래스 이름을
CheckNaN으로 변경했으므로CheckNaN.java를 컴파일해야 합니다. 터미널을 열고 다음을 실행합니다.javac CheckNaN.java컴파일이 성공하면 출력이 표시되지 않습니다.
마지막으로, 컴파일된 프로그램을 실행합니다.
java CheckNaN다음과 유사한 출력을 볼 수 있습니다.
Is result1 NaN? true Is result2 NaN? false이 출력은
Double.isNaN()이result1을 NaN 으로,result2를 일반 숫자로 올바르게 식별했음을 확인합니다.
Double.isNaN()을 사용하는 것이 Java 에서 NaN 값을 확인하는 올바르고 신뢰할 수 있는 방법입니다. 직접 비교 (== Double.NaN) 에 의존하는 것은 권장되지 않습니다. 앞서 언급했듯이 NaN == NaN은 false로 평가되기 때문입니다.
부동 소수점 연산으로 테스트
이 단계에서는 NaN 을 생성할 수 있는 부동 소수점 연산의 더 많은 예제를 살펴보고 Double.isNaN()을 사용하여 이를 확인하는 연습을 하겠습니다. 어떤 연산이 NaN 을 생성하는지 이해하는 것은 잠재적인 오류를 적절하게 처리하는 강력한 Java 코드를 작성하는 데 매우 중요합니다.
0 을 0 으로 나누는 것 외에도 무한대 또는 유효하지 않은 수학 함수와 관련된 다른 연산도 NaN 을 생성할 수 있습니다. Java 에는 양의 무한대와 음의 무한대 (Double.POSITIVE_INFINITY 및 Double.NEGATIVE_INFINITY) 에 대한 특수한 표현이 있습니다.
CheckNaN.java 프로그램을 수정하여 이러한 몇 가지 경우를 테스트해 보겠습니다.
WebIDE 편집기에서
CheckNaN.java파일을 엽니다.기존 코드를 다음으로 바꿉니다.
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입니다.result2는Math.sqrt(-1.0)을 사용하는데, 이는 실수에 대해 수학적으로 정의되지 않으며 NaN 을 생성합니다.result3은 양의 무한대에서 양의 무한대를 빼는데, 이는 또 다른 부정형으로 NaN 을 생성합니다.result4와result5는 0 으로 나누기를 보여주는데, 이는 NaN 이 아닌 양의 또는 음의 무한대를 생성합니다.result6은 비교를 위한 간단한 숫자입니다.
파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
터미널에서 수정된 프로그램을 컴파일합니다.
javac CheckNaN.java다시, 출력이 없으면 컴파일이 성공했음을 나타냅니다.
프로그램을 실행합니다.
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 인지 확인하는 새 프로그램을 만들어 보겠습니다.
~/project디렉토리에ParseAndCheck.java라는 새 파일을 만듭니다. 파일 탐색기에서 마우스 오른쪽 버튼을 클릭하고 "New File"을 선택한 다음ParseAndCheck.java를 입력하여 이 작업을 수행할 수 있습니다.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블록은 스캐너가 닫히도록 합니다.
- 사용자 입력을 읽기 위해
파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
터미널에서 프로그램을 컴파일합니다.
javac ParseAndCheck.java프로그램을 실행합니다.
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.50.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 과 일반 숫자 결과를 생성하는 부동 소수점 연산을 포함하는 예제를 통해 사용법을 시연했습니다.



