Java 프로그램에서 잘못된 사용자 입력 처리 방법

JavaBeginner
지금 연습하기

소개

잘못된 사용자 입력을 처리하는 것은 Java 프로그래밍에서 애플리케이션의 견고성과 신뢰성을 보장하는 중요한 측면입니다. 사용자가 프로그램과 상호 작용할 때 예상치 못한 또는 잘못된 데이터를 제공할 수 있으며, 이는 적절하게 관리하지 않으면 애플리케이션이 충돌을 일으킬 수 있습니다.

이 Lab 에서는 Java 애플리케이션에서 잘못된 사용자 입력을 효과적으로 처리하는 방법을 배우게 됩니다. 기본적인 오류 검사부터 더 발전된 유효성 검사 방법까지 다양한 기술을 탐구할 것입니다. 이 Lab 을 마치면 사용자 오류를 우아하게 처리하고 적절한 피드백을 제공하는 Java 프로그램을 작성할 수 있게 됩니다.

사용자 입력을 사용하는 기본 Java 프로그램 생성

이 첫 번째 단계에서는 사용자 입력을 수집하는 간단한 Java 프로그램을 만들 것입니다. 이는 입력 유효성 검사 기술을 배우기 위한 기반이 될 것입니다.

Java 에서 사용자 입력 이해하기

Java 는 사용자로부터 입력을 수집하는 여러 가지 방법을 제공합니다. 콘솔 애플리케이션의 경우 java.util 패키지의 Scanner 클래스가 일반적으로 사용됩니다. 이 클래스는 정수, 부동 소수점 숫자 및 문자열과 같은 다양한 유형의 입력을 읽는 메서드를 제공합니다.

입력 프로그램 만들기

사용자의 나이를 묻고 다시 출력하는 기본 Java 프로그램을 만들어 보겠습니다.

  1. 먼저 WebIDE 를 열고 프로젝트 디렉토리로 이동합니다.

  2. WebIDE 의 파일 탐색기에서 "New File" 아이콘을 클릭하여 새 파일을 만듭니다. 파일 이름을 UserInputDemo.java로 지정합니다.

  3. 다음 코드를 파일에 추가합니다.

import java.util.Scanner;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        // Prompt the user for their age
        System.out.print("Please enter your age: ");

        // Read the input
        int age = scanner.nextInt();

        // Display the entered age
        System.out.println("You entered: " + age);

        // Close the scanner
        scanner.close();
    }
}
  1. Ctrl+S를 누르거나 메뉴에서 "File" > "Save"를 선택하여 파일을 저장합니다.

  2. 상단 메뉴에서 "Terminal" > "New Terminal"을 클릭하여 WebIDE 에서 터미널을 엽니다.

Input Demo
  1. 다음 명령을 실행하여 Java 프로그램을 컴파일합니다.
javac UserInputDemo.java
  1. 다음 명령으로 프로그램을 실행합니다.
java UserInputDemo
  1. 메시지가 표시되면 숫자, 예를 들어 25를 입력합니다. 다음과 같은 출력이 표시됩니다.
Please enter your age: 25
You entered: 25

잘못된 입력 시 어떻게 될까요?

이제 잘못된 입력을 제공할 때 어떻게 되는지 살펴보겠습니다. 프로그램을 다시 실행합니다.

java UserInputDemo

이번에는 twenty-five와 같이 숫자가 아닌 값을 입력합니다. 다음과 유사한 오류 메시지가 표시됩니다.

Please enter your age: twenty-five
Exception in thread "main" java.util.InputMismatchException
 at java.base/java.util.Scanner.throwFor(Scanner.java:943)
 at java.base/java.util.Scanner.next(Scanner.java:1598)
 at java.base/java.util.Scanner.nextInt(Scanner.java:2263)
 at java.base/java.util.Scanner.nextInt(Scanner.java:2217)
 at UserInputDemo.main(UserInputDemo.java:12)

InputMismatchException은 프로그램이 숫자 입력 (정수) 을 예상했지만 텍스트를 받았기 때문에 발생합니다. 프로그램은 이를 우아하게 처리하는 대신 충돌합니다. 다음 단계에서는 이러한 잘못된 입력을 적절하게 처리하는 방법을 배우게 됩니다.

잘못된 입력에 대한 예외 처리

이 단계에서는 Java 의 예외 처리 메커니즘을 사용하여 잘못된 입력을 처리하도록 프로그램을 수정합니다.

Java 예외 이해하기

Java 의 예외는 프로그램 실행의 정상적인 흐름을 방해하는 이벤트입니다. 사용자가 잘못된 입력을 제공하면 Java 런타임 시스템은 예외를 발생시켜 문제가 발생했음을 알립니다. 프로그램은 이러한 예외를 catch 하여 충돌하는 대신 적절하게 처리할 수 있습니다.

Java 에서 예외 처리를 위한 기본 구조는 try-catch 블록입니다.

try {
    // Code that might throw an exception
} catch (ExceptionType e) {
    // Code to handle the exception
}

예외를 처리하도록 프로그램 수정하기

사용자가 숫자가 아닌 입력을 입력할 때 발생하는 InputMismatchException을 처리하도록 프로그램을 업데이트해 보겠습니다.

  1. WebIDE 에서 UserInputDemo.java 파일을 엽니다.

  2. 예외 처리를 포함하도록 코드를 수정합니다.

import java.util.Scanner;
import java.util.InputMismatchException;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        try {
            // Prompt the user for their age
            System.out.print("Please enter your age: ");

            // Read the input
            int age = scanner.nextInt();

            // Display the entered age
            System.out.println("You entered: " + age);
        } catch (InputMismatchException e) {
            // Handle the exception if non-numeric input is provided
            System.out.println("Error: Please enter a valid numeric age.");
        } finally {
            // Close the scanner in the finally block to ensure it always gets closed
            scanner.close();
        }
    }
}
  1. Ctrl+S를 눌러 파일을 저장합니다.

  2. 업데이트된 프로그램을 컴파일합니다.

javac UserInputDemo.java
  1. 프로그램을 실행합니다.
java UserInputDemo
  1. twenty-five와 같이 숫자가 아닌 값을 입력해 봅니다. 충돌하는 대신 프로그램은 이제 다음을 표시합니다.
Please enter your age: twenty-five
Error: Please enter a valid numeric age.

예외 처리 개선하기

현재 구현은 예외를 처리하지만 즉시 종료됩니다. 사용자에게 유효한 나이를 입력할 수 있는 여러 번의 시도를 제공하여 이를 개선해 보겠습니다.

  1. WebIDE 에서 UserInputDemo.java 파일을 엽니다.

  2. 여러 번의 시도를 허용하도록 코드를 수정합니다.

import java.util.Scanner;
import java.util.InputMismatchException;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        boolean validInput = false;
        int age = 0;

        // Keep trying until valid input is received
        while (!validInput) {
            try {
                // Prompt the user for their age
                System.out.print("Please enter your age: ");

                // Read the input
                age = scanner.nextInt();

                // If we get here, the input was valid
                validInput = true;
            } catch (InputMismatchException e) {
                // Handle the exception if non-numeric input is provided
                System.out.println("Error: Please enter a valid numeric age.");

                // Clear the invalid input from the scanner
                scanner.nextLine();
            }
        }

        // Display the entered age
        System.out.println("You entered: " + age);

        // Close the scanner
        scanner.close();
    }
}
  1. 파일을 저장합니다.

  2. 프로그램을 다시 컴파일하고 실행합니다.

javac UserInputDemo.java
java UserInputDemo
  1. 먼저 잘못된 입력을 입력한 다음 유효한 입력을 입력해 봅니다.
Please enter your age: twenty-five
Error: Please enter a valid numeric age.
Please enter your age: 25
You entered: 25

이제 프로그램은 사용자에게 유효한 입력을 제공할 수 있는 여러 기회를 제공합니다. 이는 잘못된 입력을 우아하게 처리하는 데 있어 상당한 개선입니다.

조건문을 사용한 입력 유효성 검사 구현

예외 처리 외에도 조건문을 사용하여 사용자 입력을 검증할 수 있습니다. 이 접근 방식을 사용하면 입력을 처리하기 전에 사용자 지정 유효성 검사 규칙을 구현할 수 있습니다.

입력 유효성 검사 이해하기

입력 유효성 검사는 사용자 입력을 확인하여 처리하기 전에 특정 기준을 충족하는지 확인하는 프로세스입니다. 예를 들어, 나이 값이 숫자일 뿐만 아니라 합리적인 범위 내에 있는지 확인하려고 할 수 있습니다.

프로그램에 범위 유효성 검사 추가하기

사용자가 0 에서 120 사이의 나이를 입력하는지 확인하도록 프로그램을 개선해 보겠습니다.

  1. WebIDE 에서 UserInputDemo.java 파일을 엽니다.

  2. 범위 유효성 검사를 포함하도록 코드를 수정합니다.

import java.util.Scanner;
import java.util.InputMismatchException;

public class UserInputDemo {
    public static void main(String[] args) {
        // Create a Scanner object to read input
        Scanner scanner = new Scanner(System.in);

        boolean validInput = false;
        int age = 0;

        // Keep trying until valid input is received
        while (!validInput) {
            try {
                // Prompt the user for their age
                System.out.print("Please enter your age (0-120): ");

                // Read the input
                age = scanner.nextInt();

                // Check if the age is within a valid range
                if (age < 0 || age > 120) {
                    System.out.println("Error: Age must be between 0 and 120.");
                } else {
                    // If we get here, the input was valid
                    validInput = true;
                }
            } catch (InputMismatchException e) {
                // Handle the exception if non-numeric input is provided
                System.out.println("Error: Please enter a valid numeric age.");

                // Clear the invalid input from the scanner
                scanner.nextLine();
            }
        }

        // Display the entered age
        System.out.println("You entered: " + age);

        // Close the scanner
        scanner.close();
    }
}
  1. Ctrl+S를 눌러 파일을 저장합니다.

  2. 프로그램을 컴파일합니다.

javac UserInputDemo.java
  1. 프로그램을 실행합니다.
java UserInputDemo
  1. 다양한 입력으로 프로그램을 테스트합니다.

    • 유효한 나이 입력 (예: 25):
    Please enter your age (0-120): 25
    You entered: 25
    • 음수 나이 입력:
    Please enter your age (0-120): -5
    Error: Age must be between 0 and 120.
    Please enter your age (0-120):
    • 120 보다 큰 나이 입력:
    Please enter your age (0-120): 150
    Error: Age must be between 0 and 120.
    Please enter your age (0-120):
    • 숫자가 아닌 값 입력:
    Please enter your age (0-120): twenty-five
    Error: Please enter a valid numeric age.
    Please enter your age (0-120):

더 복잡한 예제 만들기: 사용자 등록 양식

사용자 등록 양식에 대해 여러 필드를 검증하는 보다 포괄적인 예제를 만들어 보겠습니다.

  1. WebIDE 에서 UserRegistration.java라는 새 파일을 만듭니다.

  2. 다음 코드를 파일에 추가합니다.

import java.util.Scanner;

public class UserRegistration {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Get and validate username
        String username = getValidUsername(scanner);

        // Get and validate age
        int age = getValidAge(scanner);

        // Get and validate email
        String email = getValidEmail(scanner);

        // Display the registration information
        System.out.println("\nRegistration Successful!");
        System.out.println("Username: " + username);
        System.out.println("Age: " + age);
        System.out.println("Email: " + email);

        scanner.close();
    }

    private static String getValidUsername(Scanner scanner) {
        String username;
        boolean validUsername = false;

        do {
            System.out.print("Enter username (3-15 characters): ");
            username = scanner.nextLine().trim();

            if (username.length() < 3 || username.length() > 15) {
                System.out.println("Error: Username must be between 3 and 15 characters.");
            } else {
                validUsername = true;
            }
        } while (!validUsername);

        return username;
    }

    private static int getValidAge(Scanner scanner) {
        int age = 0;
        boolean validAge = false;

        while (!validAge) {
            try {
                System.out.print("Enter your age (0-120): ");
                age = Integer.parseInt(scanner.nextLine());

                if (age < 0 || age > 120) {
                    System.out.println("Error: Age must be between 0 and 120.");
                } else {
                    validAge = true;
                }
            } catch (NumberFormatException e) {
                System.out.println("Error: Please enter a valid numeric age.");
            }
        }

        return age;
    }

    private static String getValidEmail(Scanner scanner) {
        String email;
        boolean validEmail = false;

        do {
            System.out.print("Enter your email: ");
            email = scanner.nextLine().trim();

            // Simple email validation: must contain @ and a period after @
            if (!email.contains("@") || email.indexOf('.', email.indexOf('@')) == -1) {
                System.out.println("Error: Please enter a valid email address.");
            } else {
                validEmail = true;
            }
        } while (!validEmail);

        return email;
    }
}
  1. Ctrl+S를 눌러 파일을 저장합니다.

  2. 프로그램을 컴파일합니다.

javac UserRegistration.java
  1. 프로그램을 실행합니다.
java UserRegistration
  1. 프롬프트에 따라 사용자 이름, 나이 및 이메일을 입력합니다. 프로그램은 각 입력을 검증하고 유효한 데이터가 입력된 경우에만 진행됩니다.

유효한 입력 시퀀스 예:

Enter username (3-15 characters): johnsmith
Enter your age (0-120): 30
Enter your email: john.smith@example.com

Registration Successful!
Username: johnsmith
Age: 30
Email: john.smith@example.com

이 보다 포괄적인 예제는 예외 처리와 조건부 유효성 검사를 모두 사용하여 다양한 유형의 사용자 입력을 검증하는 방법을 보여줍니다.

정규 표현식을 사용한 입력 유효성 검사

정규 표현식 (regex) 은 이메일 주소, 전화 번호, 비밀번호와 같은 복잡한 입력 패턴을 검증하는 강력한 방법을 제공합니다. 이 단계에서는 Java 에서 정규 표현식을 사용하여 고급 입력 유효성 검사를 수행하는 방법을 배웁니다.

정규 표현식 이해하기

정규 표현식은 검색 패턴을 정의하는 일련의 문자입니다. 이러한 패턴은 문자열이 특정 형식에 부합하는지 검증하는 데 사용할 수 있습니다. Java 는 정규 표현식으로 작업하기 위한 PatternMatcher 클래스를 포함하는 java.util.regex 패키지를 제공합니다.

UserRegistration 프로그램에 정규 표현식 유효성 검사 추가하기

UserRegistration 프로그램을 개선하여 보다 강력한 입력 유효성 검사를 위해 정규 표현식을 사용해 보겠습니다.

  1. WebIDE 에서 UserRegistration.java 파일을 엽니다.

  2. 정규 표현식 유효성 검사를 포함하도록 파일을 수정합니다.

import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class UserRegistration {
    // Regular expression patterns
    private static final String USERNAME_PATTERN = "^[a-zA-Z0-9_]{3,15}$";
    private static final String EMAIL_PATTERN = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    private static final String PHONE_PATTERN = "^\\d{3}-\\d{3}-\\d{4}$";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Get and validate username
        String username = getValidUsername(scanner);

        // Get and validate age
        int age = getValidAge(scanner);

        // Get and validate email
        String email = getValidEmail(scanner);

        // Get and validate phone number
        String phone = getValidPhone(scanner);

        // Display the registration information
        System.out.println("\nRegistration Successful!");
        System.out.println("Username: " + username);
        System.out.println("Age: " + age);
        System.out.println("Email: " + email);
        System.out.println("Phone: " + phone);

        scanner.close();
    }

    private static String getValidUsername(Scanner scanner) {
        String username;
        boolean validUsername = false;
        Pattern pattern = Pattern.compile(USERNAME_PATTERN);

        do {
            System.out.print("Enter username (3-15 alphanumeric characters or underscore): ");
            username = scanner.nextLine().trim();

            Matcher matcher = pattern.matcher(username);
            if (!matcher.matches()) {
                System.out.println("Error: Username must be 3-15 characters long and contain only letters, numbers, or underscores.");
            } else {
                validUsername = true;
            }
        } while (!validUsername);

        return username;
    }

    private static int getValidAge(Scanner scanner) {
        int age = 0;
        boolean validAge = false;

        while (!validAge) {
            try {
                System.out.print("Enter your age (0-120): ");
                age = Integer.parseInt(scanner.nextLine());

                if (age < 0 || age > 120) {
                    System.out.println("Error: Age must be between 0 and 120.");
                } else {
                    validAge = true;
                }
            } catch (NumberFormatException e) {
                System.out.println("Error: Please enter a valid numeric age.");
            }
        }

        return age;
    }

    private static String getValidEmail(Scanner scanner) {
        String email;
        boolean validEmail = false;
        Pattern pattern = Pattern.compile(EMAIL_PATTERN);

        do {
            System.out.print("Enter your email: ");
            email = scanner.nextLine().trim();

            Matcher matcher = pattern.matcher(email);
            if (!matcher.matches()) {
                System.out.println("Error: Please enter a valid email address.");
            } else {
                validEmail = true;
            }
        } while (!validEmail);

        return email;
    }

    private static String getValidPhone(Scanner scanner) {
        String phone;
        boolean validPhone = false;
        Pattern pattern = Pattern.compile(PHONE_PATTERN);

        do {
            System.out.print("Enter your phone number (format: 123-456-7890): ");
            phone = scanner.nextLine().trim();

            Matcher matcher = pattern.matcher(phone);
            if (!matcher.matches()) {
                System.out.println("Error: Please enter a valid phone number in the format 123-456-7890.");
            } else {
                validPhone = true;
            }
        } while (!validPhone);

        return phone;
    }
}
  1. Ctrl+S를 눌러 파일을 저장합니다.

  2. 프로그램을 컴파일합니다.

javac UserRegistration.java
  1. 프로그램을 실행합니다.
java UserRegistration
  1. 다양한 입력으로 프로그램을 테스트합니다.

    • 잘못된 사용자 이름 입력 (너무 짧거나 특수 문자 포함):
    Enter username (3-15 alphanumeric characters or underscore): a$
    Error: Username must be 3-15 characters long and contain only letters, numbers, or underscores.
    Enter username (3-15 alphanumeric characters or underscore):
    • 잘못된 이메일 입력 (@ 또는 도메인 누락):
    Enter username (3-15 alphanumeric characters or underscore): johndoe
    Enter your age (0-120): 25
    Enter your email: johndoe.com
    Error: Please enter a valid email address.
    Enter your email:
    • 잘못된 전화 번호 입력 (잘못된 형식):
    Enter username (3-15 alphanumeric characters or underscore): johndoe
    Enter your age (0-120): 25
    Enter your email: john.doe@example.com
    Enter your phone number (format: 123-456-7890): 1234567890
    Error: Please enter a valid phone number in the format 123-456-7890.
    Enter your phone number (format: 123-456-7890):
    • 모든 유효한 입력 입력:
    Enter username (3-15 alphanumeric characters or underscore): johndoe
    Enter your age (0-120): 25
    Enter your email: john.doe@example.com
    Enter your phone number (format: 123-456-7890): 123-456-7890
    
    Registration Successful!
    Username: johndoe
    Age: 25
    Email: john.doe@example.com
    Phone: 123-456-7890

정규 표현식 패턴 이해하기

프로그램에서 사용된 정규 표현식 패턴을 살펴보겠습니다.

  1. USERNAME_PATTERN: ^[a-zA-Z0-9_]{3,15}$

    • ^$는 패턴이 전체 문자열과 일치하도록 합니다.
    • [a-zA-Z0-9_]는 모든 문자 (대문자 또는 소문자), 숫자 또는 밑줄과 일치합니다.
    • {3,15}는 길이가 3~15 자 사이여야 함을 지정합니다.
  2. EMAIL_PATTERN: ^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$

    • 이 패턴은 일반적인 규칙에 따라 이메일 주소를 검증합니다.
    • 이메일에 사용자 이름 부분, @ 기호 및 도메인이 있는지 확인합니다.
  3. PHONE_PATTERN: ^\\d{3}-\\d{3}-\\d{4}$

    • \\d는 모든 숫자 (0-9) 와 일치합니다.
    • {3}{4}는 숫자의 수를 지정합니다.
    • -는 리터럴 하이픈 문자와 일치합니다.

정규 표현식은 입력 유효성 검사를 위한 강력한 도구이지만 복잡할 수 있습니다. 정규 표현식에 익숙해지면 애플리케이션에 대한 보다 정교한 유효성 검사 패턴을 만들 수 있습니다.

완전한 양식 유효성 검사 시스템 만들기

이 마지막 단계에서는 지금까지 배운 모든 기술을 통합하는 완전한 양식 유효성 검사 시스템을 구축합니다. 다양한 애플리케이션에 쉽게 확장할 수 있는 보다 모듈식이고 재사용 가능한 유효성 검사 시스템을 만들 것입니다.

유효성 검사 유틸리티 클래스 만들기

유효성 검사 메서드를 캡슐화하는 유틸리티 클래스를 만들어 보겠습니다.

  1. WebIDE 에서 InputValidator.java라는 새 파일을 만듭니다.

  2. 다음 코드를 파일에 추가합니다.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Utility class for validating user input
 */
public class InputValidator {
    // Regular expression patterns
    private static final String USERNAME_PATTERN = "^[a-zA-Z0-9_]{3,15}$";
    private static final String EMAIL_PATTERN = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
    private static final String PHONE_PATTERN = "^\\d{3}-\\d{3}-\\d{4}$";
    private static final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$";

    /**
     * Validates a username
     * @param username The username to validate
     * @return true if the username is valid, false otherwise
     */
    public static boolean isValidUsername(String username) {
        if (username == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(USERNAME_PATTERN);
        Matcher matcher = pattern.matcher(username);
        return matcher.matches();
    }

    /**
     * Validates an email address
     * @param email The email to validate
     * @return true if the email is valid, false otherwise
     */
    public static boolean isValidEmail(String email) {
        if (email == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(EMAIL_PATTERN);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

    /**
     * Validates a phone number
     * @param phone The phone number to validate
     * @return true if the phone number is valid, false otherwise
     */
    public static boolean isValidPhone(String phone) {
        if (phone == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(PHONE_PATTERN);
        Matcher matcher = pattern.matcher(phone);
        return matcher.matches();
    }

    /**
     * Validates an age
     * @param age The age to validate
     * @return true if the age is valid, false otherwise
     */
    public static boolean isValidAge(int age) {
        return age >= 0 && age <= 120;
    }

    /**
     * Validates a password
     * @param password The password to validate
     * @return true if the password is valid, false otherwise
     */
    public static boolean isValidPassword(String password) {
        if (password == null) {
            return false;
        }
        Pattern pattern = Pattern.compile(PASSWORD_PATTERN);
        Matcher matcher = pattern.matcher(password);
        return matcher.matches();
    }

    /**
     * Gets the error message for an invalid username
     * @return The error message
     */
    public static String getUsernameErrorMessage() {
        return "Username must be 3-15 characters long and contain only letters, numbers, or underscores.";
    }

    /**
     * Gets the error message for an invalid email
     * @return The error message
     */
    public static String getEmailErrorMessage() {
        return "Please enter a valid email address.";
    }

    /**
     * Gets the error message for an invalid phone number
     * @return The error message
     */
    public static String getPhoneErrorMessage() {
        return "Please enter a valid phone number in the format 123-456-7890.";
    }

    /**
     * Gets the error message for an invalid age
     * @return The error message
     */
    public static String getAgeErrorMessage() {
        return "Age must be between 0 and 120.";
    }

    /**
     * Gets the error message for an invalid password
     * @return The error message
     */
    public static String getPasswordErrorMessage() {
        return "Password must be at least 8 characters long and contain at least one digit, one lowercase letter, one uppercase letter, one special character, and no whitespace.";
    }
}
  1. Ctrl+S를 눌러 파일을 저장합니다.

완전한 등록 양식 만들기

이제 InputValidator 클래스를 사용하는 새로운 버전의 등록 양식을 만들어 보겠습니다.

  1. WebIDE 에서 CompleteRegistrationForm.java라는 새 파일을 만듭니다.

  2. 다음 코드를 파일에 추가합니다.

import java.util.Scanner;

public class CompleteRegistrationForm {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Collect and validate user information
        String username = getValidInput(scanner, "Username", InputValidator::isValidUsername, InputValidator.getUsernameErrorMessage());
        int age = getValidAge(scanner);
        String email = getValidInput(scanner, "Email", InputValidator::isValidEmail, InputValidator.getEmailErrorMessage());
        String phone = getValidInput(scanner, "Phone number (format: 123-456-7890)", InputValidator::isValidPhone, InputValidator.getPhoneErrorMessage());
        String password = getValidInput(scanner, "Password", InputValidator::isValidPassword, InputValidator.getPasswordErrorMessage());

        // Display the registration information
        System.out.println("\nRegistration Successful!");
        System.out.println("Username: " + username);
        System.out.println("Age: " + age);
        System.out.println("Email: " + email);
        System.out.println("Phone: " + phone);
        System.out.println("Password: " + maskPassword(password));

        scanner.close();
    }

    /**
     * Generic method to get valid input from the user
     * @param scanner The scanner to read input
     * @param fieldName The name of the field being validated
     * @param validator The validation function
     * @param errorMessage The error message to display
     * @return The validated input
     */
    private static String getValidInput(Scanner scanner, String fieldName, java.util.function.Predicate<String> validator, String errorMessage) {
        String input;
        boolean validInput = false;

        do {
            System.out.print("Enter your " + fieldName + ": ");
            input = scanner.nextLine().trim();

            if (!validator.test(input)) {
                System.out.println("Error: " + errorMessage);
            } else {
                validInput = true;
            }
        } while (!validInput);

        return input;
    }

    /**
     * Gets a valid age from the user
     * @param scanner The scanner to read input
     * @return The validated age
     */
    private static int getValidAge(Scanner scanner) {
        int age = 0;
        boolean validAge = false;

        while (!validAge) {
            try {
                System.out.print("Enter your age (0-120): ");
                age = Integer.parseInt(scanner.nextLine());

                if (!InputValidator.isValidAge(age)) {
                    System.out.println("Error: " + InputValidator.getAgeErrorMessage());
                } else {
                    validAge = true;
                }
            } catch (NumberFormatException e) {
                System.out.println("Error: Please enter a valid numeric age.");
            }
        }

        return age;
    }

    /**
     * Masks a password for display
     * @param password The password to mask
     * @return The masked password
     */
    private static String maskPassword(String password) {
        if (password == null || password.isEmpty()) {
            return "";
        }
        return "*".repeat(password.length());
    }
}
  1. Ctrl+S를 눌러 파일을 저장합니다.

  2. 두 Java 파일을 모두 컴파일합니다.

javac InputValidator.java
javac CompleteRegistrationForm.java
  1. 등록 양식 프로그램을 실행합니다.
java CompleteRegistrationForm
  1. 프롬프트에 따라 각 필드에 유효한 정보를 입력합니다. 프로그램은 InputValidator 클래스에 정의된 규칙에 따라 각 입력을 검증합니다.

샘플 상호 작용:

Enter your Username: john_doe
Enter your age (0-120): 35
Enter your Email: john.doe@example.com
Enter your Phone number (format: 123-456-7890): 123-456-7890
Enter your Password: weakpw
Error: Password must be at least 8 characters long and contain at least one digit, one lowercase letter, one uppercase letter, one special character, and no whitespace.
Enter your Password: P@ssw0rd123

Registration Successful!
Username: john_doe
Age: 35
Email: john.doe@example.com
Phone: 123-456-7890
Password: ***********

이 접근 방식의 장점

이 마지막 예제에서 사용한 접근 방식은 몇 가지 장점을 제공합니다.

  1. 모듈성: 유효성 검사 로직이 재사용 가능한 유틸리티 클래스로 분리됩니다.
  2. 확장성: 새로운 유효성 검사 규칙을 InputValidator 클래스에 쉽게 추가할 수 있습니다.
  3. 유지 관리 용이성: 오류 메시지가 중앙 집중화되어 쉽게 업데이트할 수 있습니다.
  4. 코드 재사용: getValidInput 메서드는 일반적이며 다양한 유형의 입력에 사용할 수 있습니다.
  5. 보안: 비밀번호는 사용자에게 표시될 때 마스킹됩니다.

이 설계는 우수한 소프트웨어 엔지니어링 원칙을 따르며 다양한 애플리케이션에 유효성 검사 시스템을 쉽게 적용할 수 있도록 합니다.

요약

이 Lab 에서 Java 프로그램에서 잘못된 사용자 입력을 효과적으로 처리하는 방법을 배웠습니다. 입력 처리에 대한 기본적인 이해에서 포괄적인 유효성 검사 시스템 구현까지 발전했습니다. 다음은 수행한 작업에 대한 요약입니다.

  1. Scanner 클래스를 사용하여 사용자 입력을 수집하는 기본적인 Java 프로그램을 만들었습니다.
  2. 잘못된 입력을 적절하게 관리하기 위해 예외 처리 (exception handling) 를 구현했습니다.
  3. 입력이 특정 기준을 충족하도록 조건부 유효성 검사 (conditional validation) 를 추가했습니다.
  4. 고급 패턴 기반 유효성 검사 (pattern-based validation) 를 위해 정규 표현식 (regular expression) 을 사용했습니다.
  5. 유틸리티 클래스를 사용하여 모듈식이고 재사용 가능한 유효성 검사 시스템을 구축했습니다.

이러한 기술은 사용자 입력의 예측 불가능한 특성을 처리할 수 있는 강력한 Java 애플리케이션을 개발하는 데 필수적입니다. 잘못된 입력을 적절하게 검증하고 처리함으로써 프로그램 충돌을 방지하고, 데이터 무결성을 유지하며, 더 나은 사용자 경험을 제공할 수 있습니다.

Java 프로그래밍 여정을 계속 진행하면서 입력 유효성 검사는 오류를 방지하는 것뿐만 아니라 보안 및 사용성을 향상시키는 것임을 기억하십시오. 이 Lab 에서 배운 원칙은 간단한 콘솔 프로그램에서 복잡한 웹 애플리케이션에 이르기까지 다양한 유형의 애플리케이션에 적용할 수 있습니다.