Java 에서 문자열이 숫자인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 주어진 문자열이 숫자 값을 나타내는지 확인하는 다양한 방법을 배우게 됩니다. 먼저 문자열을 정수로 파싱 (parsing) 을 시도하고, 문자열이 유효한 숫자가 아닐 경우 발생할 수 있는 잠재적인 오류를 처리하는 방법을 살펴보겠습니다.

그 다음, 보다 유연하고 강력한 숫자 확인을 위해 정규 표현식 (regular expression) 의 강력함을 활용하는 방법을 배우게 됩니다. 마지막으로, 음수와 소수 값을 나타내는 문자열을 처리하도록 이해를 확장하여 숫자 확인이 포괄적으로 이루어지도록 할 것입니다.

문자열을 정수로 파싱 시도

이 단계에서는 Java 에서 문자열 (텍스트) 을 정수 (정수) 로 변환하는 방법을 살펴보겠습니다. 이는 프로그래밍에서 흔히 사용되는 작업이며, 특히 사용자로부터 숫자 입력을 받거나 파일에서 숫자를 읽어야 할 때 유용합니다.

Java 는 Integer.parseInt() 메서드를 사용하여 이를 수행하는 내장된 방법을 제공합니다. 그러나 문자열이 실제로 유효한 숫자를 나타내지 않으면 어떻게 될까요? 간단한 Java 프로그램을 작성하여 알아보겠습니다.

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

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

    public class HelloJava {
        public static void main(String[] args) {
            String numberString = "123";
            int number = Integer.parseInt(numberString);
            System.out.println("Successfully parsed: " + number);
    
            String invalidString = "abc";
            try {
                int invalidNumber = Integer.parseInt(invalidString);
                System.out.println("This line will not be reached.");
            } catch (NumberFormatException e) {
                System.out.println("Error: Could not parse '" + invalidString + "' to an integer.");
                System.out.println("Exception details: " + e.getMessage());
            }
        }
    }

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

    • String numberString = "123";: numberString 문자열 변수를 생성하고 값 "123"을 할당합니다.
    • int number = Integer.parseInt(numberString);: 이것이 변환의 핵심입니다. Integer.parseInt()는 문자열 "123"을 정수로 변환하려고 시도합니다. "123"은 유효한 정수 표현이므로 성공하고, 정수 값 123number 변수에 저장됩니다.
    • String invalidString = "abc";: 다른 문자열 변수 invalidString을 생성하고 값 "abc"를 할당합니다. 이 문자열은 유효한 정수를 나타내지 않습니다.
    • try { ... } catch (NumberFormatException e) { ... }: 이는 Java 에서 오류 (예외) 를 처리하는 데 사용되는 try-catch 블록입니다.
      • try 블록 내부의 코드는 오류를 발생시킬 수 있는 작업을 넣는 곳입니다. 이 경우 Integer.parseInt(invalidString)입니다.
      • Integer.parseInt("abc")"abc"가 유효한 숫자가 아니기 때문에 실패하면 NumberFormatException을 "throw"합니다.
      • catch (NumberFormatException e) 블록은 이 특정 유형의 예외를 "catch"합니다. 그런 다음 catch 블록 내부의 코드가 실행됩니다.
    • System.out.println("Error: Could not parse '" + invalidString + "' to an integer.");: NumberFormatException이 발생하면 이 줄이 출력됩니다.
    • System.out.println("Exception details: " + e.getMessage());: 이는 예외 객체 e에서 제공하는 오류에 대한 보다 구체적인 메시지를 출력합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

    javac HelloJava.java

    오류가 없으면 출력이 표시되지 않습니다.

  5. 컴파일된 프로그램을 실행합니다.

    java HelloJava

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

    Successfully parsed: 123
    Error: Could not parse 'abc' to an integer.
    Exception details: For input string: "abc"

    이 출력은 첫 번째 파싱 시도는 성공했지만, 유효하지 않은 문자열 "abc"를 사용한 두 번째 시도는 NumberFormatException을 발생시켰고, catch 블록이 오류 메시지를 출력하여 이를 적절하게 처리했음을 보여줍니다.

이는 모든 문자열을 성공적으로 파싱할 수 없으므로 문자열을 숫자로 변환할 때 잠재적인 오류를 처리하는 것이 중요하다는 것을 보여줍니다. try-catch 블록을 사용하는 것은 Java 에서 이러한 상황을 관리하는 표준적인 방법입니다.

정규 표현식을 사용하여 숫자 확인

이전 단계에서 Integer.parseInt()가 문자열이 유효한 정수가 아닌 경우 예외를 발생시킨다는 것을 확인했습니다. try-catch는 오류가 발생했을 때 처리하는 데 유용하지만, 때로는 변환을 시도하기 전에 문자열을 숫자로 파싱할 수 있는지 확인하고 싶을 수 있습니다. 이때 정규 표현식 (Regex) 이 유용합니다.

정규 표현식은 문자열에서 문자 조합을 일치시키는 데 사용되는 강력한 패턴입니다. 간단한 정규 표현식 패턴을 사용하여 문자열이 숫자만으로 구성되어 있는지 확인할 수 있습니다.

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

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

    public class HelloJava {
        public static void main(String[] args) {
            String numberString = "123";
            String invalidString = "abc";
            String mixedString = "123a";
    
            System.out.println("Checking string: \"" + numberString + "\"");
            if (numberString.matches("\\d+")) {
                System.out.println("  Matches the pattern (contains only digits).");
                int number = Integer.parseInt(numberString);
                System.out.println("  Parsed integer: " + number);
            } else {
                System.out.println("  Does not match the pattern.");
            }
    
            System.out.println("\nChecking string: \"" + invalidString + "\"");
            if (invalidString.matches("\\d+")) {
                System.out.println("  Matches the pattern (contains only digits).");
            } else {
                System.out.println("  Does not match the pattern.");
            }
    
            System.out.println("\nChecking string: \"" + mixedString + "\"");
            if (mixedString.matches("\\d+")) {
                System.out.println("  Matches the pattern (contains only digits).");
            } else {
                System.out.println("  Does not match the pattern.");
            }
        }
    }

    새로운 부분을 살펴보겠습니다.

    • numberString.matches("\\d+"): 이것이 핵심 부분입니다. matches() 메서드는 Java 의 모든 String 객체에서 사용할 수 있습니다. 주어진 정규 표현식 패턴과 전체 문자열이 일치하는지 확인합니다.
    • "\\d+": 이것이 정규 표현식 패턴입니다.
      • \\d: 이는 모든 숫자 (0 에서 9 까지) 와 일치합니다. \는 Java 문자열에서 특수 문자이므로 이스케이프해야 하므로 \\를 사용합니다.
      • +: 이는 이전 요소의 "하나 이상"을 의미하는 수량자입니다. 따라서 \\d+는 "하나 이상의 숫자"를 의미합니다.
    • if 문은 matches()의 결과를 확인합니다. true를 반환하면 문자열이 하나 이상의 숫자로만 구성되어 있음을 의미합니다. false를 반환하면 문자열에 숫자 이외의 문자가 포함되어 있거나 비어 있음을 의미합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

    javac HelloJava.java

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

  5. 컴파일된 프로그램을 실행합니다.

    java HelloJava

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

    Checking string: "123"
      Matches the pattern (contains only digits).
      Parsed integer: 123
    
    Checking string: "abc"
      Does not match the pattern.
    
    Checking string: "123a"
      Does not match the pattern.

    보시다시피, matches("\\d+") 검사는 "123"이 숫자만 포함하고 있음을 올바르게 식별했으며, "abc""123a"는 패턴과 일치하지 않았습니다. 이 접근 방식을 사용하면 파싱을 시도하기 전에 문자열 형식을 검증하여 경우에 따라 NumberFormatException을 방지할 수 있습니다.

음수 및 소수 처리

이전 단계에서는 양의 정수를 파싱하는 데 집중했습니다. 그러나 숫자는 음수이거나 소수점을 가질 수도 있습니다. 이 단계에서는 Java 에서 문자열을 숫자로 변환할 때 이러한 경우를 처리하는 방법을 배우겠습니다.

Java 는 다양한 유형의 숫자를 파싱하기 위한 다양한 메서드를 제공합니다.

  • Integer.parseInt(): 정수 (정수) 용.
  • Double.parseDouble(): 소수점 (부동 소수점 숫자) 이 있는 숫자용.

음수 정수와 소수점 숫자를 처리하도록 프로그램을 수정해 보겠습니다.

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

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

    public class HelloJava {
        public static void main(String[] args) {
            String positiveIntString = "456";
            String negativeIntString = "-789";
            String decimalString = "123.45";
            String invalidString = "not a number";
    
            // Handling Integers (positive and negative)
            System.out.println("Attempting to parse integers:");
            try {
                int positiveInt = Integer.parseInt(positiveIntString);
                System.out.println("  Parsed '" + positiveIntString + "' as integer: " + positiveInt);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + positiveIntString + "' as integer.");
            }
    
            try {
                int negativeInt = Integer.parseInt(negativeIntString);
                System.out.println("  Parsed '" + negativeIntString + "' as integer: " + negativeInt);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + negativeIntString + "' as integer.");
            }
    
            try {
                int decimalAsInt = Integer.parseInt(decimalString);
                System.out.println("  Parsed '" + decimalString + "' as integer: " + decimalAsInt);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + decimalString + "' as integer.");
            }
    
            // Handling Decimal Numbers
            System.out.println("\nAttempting to parse decimal numbers:");
            try {
                double decimal = Double.parseDouble(decimalString);
                System.out.println("  Parsed '" + decimalString + "' as double: " + decimal);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + decimalString + "' as double.");
            }
    
            try {
                double intAsDouble = Double.parseDouble(positiveIntString);
                System.out.println("  Parsed '" + positiveIntString + "' as double: " + intAsDouble);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + positiveIntString + "' as double.");
            }
    
             try {
                double invalidAsDouble = Double.parseDouble(invalidString);
                System.out.println("  Parsed '" + invalidString + "' as double: " + invalidAsDouble);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + invalidString + "' as double.");
            }
        }
    }

    다음은 무슨 일이 일어나는지입니다.

    • 이제 양의 정수, 음의 정수, 소수점 숫자 및 유효하지 않은 문자열을 나타내는 문자열이 있습니다.
    • try-catch 블록 내에서 Integer.parseInt()를 사용하여 문자열을 정수로 파싱하려고 시도합니다. Integer.parseInt()는 음수 기호 (-) 를 처리할 수 있습니다. 그러나 문자열에 소수점 또는 숫자가 아닌 문자가 포함된 경우 NumberFormatException을 발생시킵니다.
    • try-catch 블록 내에서 Double.parseDouble()을 사용하여 문자열을 소수점 숫자 (double) 로 파싱하려고 시도합니다. Double.parseDouble()은 정수와 소수점이 있는 숫자를 모두 처리할 수 있습니다. double 의 유효한 표현이 아닌 문자열의 경우 NumberFormatException을 발생시킵니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

    javac HelloJava.java

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

  5. 컴파일된 프로그램을 실행합니다.

    java HelloJava

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

    Attempting to parse integers:
      Parsed '456' as integer: 456
      Parsed '-789' as integer: -789
      Could not parse '123.45' as integer.
    
    Attempting to parse decimal numbers:
      Parsed '123.45' as double: 123.45
      Parsed '456' as double: 456.0
      Could not parse 'not a number' as double.

    이 출력은 Integer.parseInt()가 양수 및 음수 정수를 올바르게 파싱했지만 소수점 문자열에서는 실패했음을 보여줍니다. Double.parseDouble()은 소수점 문자열과 정수 문자열 (예: 456.0 과 같이 double 로 표현) 을 모두 성공적으로 파싱했지만 유효하지 않은 문자열에서는 실패했습니다.

이 단계에서는 다양한 숫자 유형에 적절한 파싱 메서드를 사용하는 방법을 보여주고 입력 문자열이 예상 형식과 일치하지 않을 수 있는 경우 잠재적인 NumberFormatException 오류를 처리하기 위해 try-catch 블록을 사용하는 것의 중요성을 강조합니다.

요약

이 Lab 에서는 Java 에서 문자열이 숫자인지 확인하는 방법을 배웠습니다. 먼저 Integer.parseInt()를 사용하여 문자열을 정수로 파싱하려고 시도하여 문자열이 유효한 정수 표현이 아닌 경우 이 메서드가 NumberFormatException을 발생시킨다는 것을 이해했습니다. try-catch 블록을 사용하여 이 예외를 처리하여 숫자 형식이 아닌 문자열을 적절하게 관리하는 방법을 살펴보았습니다.

이를 바탕으로, 다양한 형식을 처리할 수 있는 숫자 문자열을 확인하기 위한 보다 유연한 접근 방식인 정규 표현식 (regular expression) 을 사용하는 방법을 배웠습니다. 마지막으로, 문자열이 숫자 값을 나타내는지 여부를 결정할 때 음수 및 소수점 숫자를 처리하는 것을 포함하도록 이해를 확장했습니다.