Java 에서 문자열을 Double 로 변환하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 주어진 문자열을 Java 에서 double-precision 부동 소수점 숫자로 성공적으로 변환할 수 있는지 확인하는 방법을 배우게 됩니다. Double.parseDouble()을 사용하여 문자열을 파싱 (parsing) 하는 과정을 살펴보고, 문자열이 유효한 숫자 표현이 아닌 경우 발생할 수 있는 잠재적인 NumberFormatException 오류를 처리하는 방법을 이해하며, 문자열이 유효한 십진수 형식을 준수하는지 확인하는 방법에 대해 논의할 것입니다. 이 랩을 마치면 Java 애플리케이션에서 문자열을 안전하고 효과적으로 double 로 변환하는 데 필요한 지식을 갖추게 됩니다.

Double.parseDouble() 을 사용한 파싱 시도

이 단계에서는 숫자의 문자열 표현을 Java 의 숫자 유형으로 변환하는 방법을 배우게 됩니다. 사용자의 입력을 받거나 파일에서 데이터를 읽을 때 흔히 사용되는 작업입니다. 입력은 종종 처음에 텍스트 (문자열) 로 읽히기 때문입니다.

Java 는 이 변환을 수행하는 여러 가지 방법을 제공합니다. 문자열을 double-precision 부동 소수점 숫자로 변환하는 가장 일반적인 방법 중 하나는 Double.parseDouble() 메서드를 사용하는 것입니다.

이를 시연하기 위해 간단한 Java 프로그램을 만들어 보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다 (아직 열려 있지 않은 경우).

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

    import java.util.Scanner;
    
    public class HelloJava {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter a decimal number: ");
            String userInput = scanner.nextLine();
    
            // Attempt to parse the input string into a double
            double number = Double.parseDouble(userInput);
    
            System.out.println("You entered: " + number);
    
            scanner.close();
        }
    }
    

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

    • System.out.print("Enter a decimal number: ");: 이 줄은 사용자에게 십진수를 입력하라는 메시지를 표시합니다.
    • String userInput = scanner.nextLine();: 이 코드는 사용자의 입력을 문자열로 읽어 userInput 변수에 저장합니다.
    • double number = Double.parseDouble(userInput);: 이것이 이 단계의 핵심입니다. Double.parseDouble()userInput 문자열을 가져와 이를 double 값으로 변환하려고 시도합니다. 문자열이 십진수로 성공적으로 해석될 수 있으면 결과 double 값이 number 변수에 저장됩니다.
    • System.out.println("You entered: " + number);: 이 줄은 파싱된 double 값을 사용자에게 다시 출력합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

    javac HelloJava.java
    

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

  5. 마지막으로 프로그램을 실행합니다.

    java HelloJava
    
  6. 프로그램은 십진수를 입력하라는 메시지를 표시합니다. 123.45와 같은 유효한 십진수를 입력하고 Enter 키를 누릅니다.

    Enter a decimal number: 123.45
    You entered: 123.45
    

    프로그램은 입력을 성공적으로 파싱하고 숫자를 다시 출력해야 합니다.

이 단계에서는 Double.parseDouble()을 사용하여 유효한 십진수의 문자열 표현을 double로 성공적으로 변환했습니다. 그러나 사용자가 유효하지 않은 숫자를 입력하면 어떻게 될까요? 다음 단계에서 이를 살펴보겠습니다.

NumberFormatException 처리

이전 단계에서는 입력 문자열이 유효한 십진수일 때 Double.parseDouble()이 어떻게 작동하는지 살펴보았습니다. 하지만 사용자가 숫자로 변환할 수 없는 텍스트를 입력하면 어떻게 될까요? 시도해 보겠습니다.

  1. 터미널에서 ~/project 디렉토리에 있는지 확인합니다.

  2. 프로그램을 다시 실행합니다.

    java HelloJava
    
  3. 십진수를 입력하라는 메시지가 표시되면 hello 또는 abc와 같이 숫자가 아닌 것을 입력합니다.

    Enter a decimal number: hello
    
  4. Enter 키를 누릅니다. 터미널에 많은 빨간색 텍스트가 표시될 것입니다. 이것은 오류 메시지이며, 특히 NumberFormatException입니다.

    Exception in thread "main" java.lang.NumberFormatException: For input string: "hello"
        at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2050)
        at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
        at java.base/java.lang.Double.parseDouble(Double.java:651)
        at HelloJava.main(HelloJava.java:10)
    

    NumberFormatException은 문자열 "hello"를 유효한 double 값으로 파싱할 수 없기 때문에 발생합니다. 이와 같은 예외가 발생하고 처리되지 않으면 프로그램이 충돌하고 실행이 중지됩니다.

    실제 애플리케이션에서는 사용자가 잘못된 입력을 입력했다고 해서 프로그램이 충돌하는 것을 원하지 않습니다. 이러한 오류를 정상적으로 처리할 방법이 필요합니다. Java 에서는 try-catch 블록을 사용하여 예외를 처리합니다.

    try-catch 블록은 다음과 같이 작동합니다.

    • 예외를 발생시킬 수 있는 코드는 try 블록 안에 배치됩니다.
    • try 블록 내에서 예외가 발생하면 catch 블록 내부의 코드가 실행됩니다.
    • 예외가 발생하지 않으면 catch 블록이 건너뜁니다.

NumberFormatException을 처리하기 위해 try-catch 블록을 사용하도록 프로그램을 수정해 보겠습니다.

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

  2. Double.parseDouble() 호출을 try-catch 블록으로 묶도록 코드를 수정합니다.

    import java.util.Scanner;
    
    public class HelloJava {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter a decimal number: ");
            String userInput = scanner.nextLine();
    
            try {
                // Attempt to parse the input string into a double
                double number = Double.parseDouble(userInput);
                System.out.println("You entered: " + number);
            } catch (NumberFormatException e) {
                // This code runs if a NumberFormatException occurs
                System.out.println("Invalid input. Please enter a valid decimal number.");
            }
    
            scanner.close();
        }
    }
    

    이 업데이트된 코드에서:

    • Double.parseDouble(userInput); 줄은 try 블록 안에 있습니다.
    • catch (NumberFormatException e) 블록은 try 블록에서 NumberFormatException이 발생하면 catch 블록 내부의 코드가 실행되어야 함을 지정합니다.
    • catch 블록 내부에서는 프로그램이 충돌하는 대신 사용자 친화적인 오류 메시지를 출력합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 수정된 프로그램을 컴파일합니다.

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

    java HelloJava
    
  6. 메시지가 표시되면 hello와 같은 잘못된 입력을 다시 입력합니다.

    Enter a decimal number: hello
    Invalid input. Please enter a valid decimal number.
    

    이번에는 충돌하는 대신 프로그램이 NumberFormatException을 포착하고 catch 블록의 메시지를 출력했습니다. 이것은 훨씬 더 나은 사용자 경험입니다!

이제 NumberFormatException과 같은 예외를 처리하기 위해 try-catch 블록을 사용하는 방법을 배웠으며, 이를 통해 프로그램을 더욱 강력하고 사용자 친화적으로 만들 수 있습니다.

유효한 소수점 형식 확인

이전 단계에서는 try-catch 블록을 사용하여 NumberFormatException을 성공적으로 처리했습니다. 이렇게 하면 입력이 유효한 숫자가 아닌 경우 프로그램이 충돌하는 것을 방지할 수 있습니다. 그러나 현재 접근 방식은 여전히 문자열을 파싱하려고 시도하며 파싱이 실패한 후에만 오류를 포착합니다.

더 적극적인 접근 방식은 파싱을 시도하기 전에 입력 문자열이 유효한 십진수 형식을 갖는지 확인하는 것입니다. 이는 정규 표현식 또는 기타 유효성 검사 기술을 사용하여 수행할 수 있습니다. 이 랩에서는 유효한 십진수가 제공될 때까지 사용자에게 입력을 반복적으로 요청하는 루프 내에서 간단한 검사를 사용합니다.

이 접근 방식은 try-catch 블록과 루프를 결합하여 유효한 입력을 얻도록 합니다.

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

  2. 유효한 입력을 받을 때까지 계속되는 루프를 포함하도록 코드를 수정합니다.

    import java.util.Scanner;
    
    public class HelloJava {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            double number = 0.0; // Initialize with a default value
            boolean validInput = false; // Flag to track valid input
    
            while (!validInput) {
                System.out.print("Enter a decimal number: ");
                String userInput = scanner.nextLine();
    
                try {
                    // Attempt to parse the input string into a double
                    number = Double.parseDouble(userInput);
                    validInput = true; // Set flag to true if parsing is successful
                } catch (NumberFormatException e) {
                    // This code runs if a NumberFormatException occurs
                    System.out.println("Invalid input. Please enter a valid decimal number.");
                }
            }
    
            System.out.println("You entered a valid number: " + number);
    
            scanner.close();
        }
    }
    

    변경 사항을 살펴보겠습니다.

    • double number = 0.0;: 루프 외부에서 number 변수를 초기화합니다.
    • boolean validInput = false;: 루프를 제어하기 위해 부울 변수 validInput을 도입합니다. 초기 값은 false입니다.
    • while (!validInput): validInputfalse인 동안 계속되는 while 루프를 만듭니다.
    • try 블록 내부에서 Double.parseDouble()이 성공하면 validInputtrue로 설정합니다. 이렇게 하면 현재 반복 후 루프가 종료됩니다.
    • NumberFormatException이 발생하면 catch 블록이 실행되고 validInputfalse로 유지되며 루프가 계속되어 사용자에게 입력을 다시 요청합니다.
    • 루프가 완료된 후 (validInputtrue인 경우) 유효한 입력을 받았음을 확인하는 메시지를 출력합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 수정된 프로그램을 컴파일합니다.

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

    java HelloJava
    
  6. 이제 먼저 잘못된 입력을 입력한 다음 유효한 십진수를 입력해 보십시오.

    Enter a decimal number: abc
    Invalid input. Please enter a valid decimal number.
    Enter a decimal number: 1.2.3
    Invalid input. Please enter a valid decimal number.
    Enter a decimal number: 789.01
    You entered a valid number: 789.01
    

    프로그램은 Double.parseDouble()이 성공적으로 변환할 수 있는 문자열을 제공할 때까지 입력을 계속 요청합니다.

이제 프로그램이 진행하기 전에 사용자로부터 유효한 십진수를 받도록 하는 기본 입력 유효성 검사 루프를 구현했습니다. 이는 많은 애플리케이션에서 사용자 입력을 처리하기 위한 기본적인 패턴입니다.

요약

이 랩에서는 Java 에서 문자열을 double 로 변환할 수 있는지 확인하는 방법을 배웠습니다. Double.parseDouble() 메서드를 사용하여 문자열을 double 로 파싱하는 것을 시도하는 것으로 시작했습니다. 이 메서드는 숫자의 문자열 표현을 숫자 형식으로 변환하는 일반적인 방법이며, 사용자 입력을 처리하거나 파일에서 데이터를 읽을 때 특히 유용합니다. 사용자에게 입력을 요청하고, 이를 문자열로 읽은 다음, Double.parseDouble()을 사용하여 double 로 변환하는 간단한 Java 프로그램을 구현하여 문자열을 double 로 변환하는 기본 프로세스를 시연했습니다.