[Java 프로젝트: Calculator] 트러블 슈팅 TIL_3

coldrice99·2024년 9월 5일
0

트러블 슈팅 TIL: 양의 정수만 입력받기

이번 TIL에서는 자바로 계산기 프로그램을 작성하던 중, 양의 정수만 입력받도록 수정한 과정을 다루려 한다. 요구 사항에서 두 정수를 입력받을 때 0을 포함한 양의 정수만 받아야 하는데, 이를 놓친 부분이 있어 트러블 슈팅을 진행하였다.


문제 상황

계산기 프로그램에서 두 정수를 입력받는 과정에서 양의 정수만 입력받아야 한다는 요구 사항을 반영하지 않았다. 음수나 정수가 아닌 값이 입력될 경우, 프로그램이 비정상적으로 작동할 수 있었다.

해결 방법

Scanner 클래스의 hasNextInt() 메서드를 사용하여 정수만 입력받도록 하고, 음수가 입력되었을 때 다시 입력을 받도록 하였다. 이를 통해 입력값이 조건을 만족하지 않을 경우 즉시 오류 메시지를 출력하고, 올바른 값을 입력받을 수 있도록 하였다.

hasNextInt()란?

hasNextInt()는 자바의 Scanner 클래스에서 입력 스트림에 다음에 입력될 값이 정수인지 확인할 때 사용하는 메서드이다. 즉, 사용자가 입력한 값이 정수이면 true를 반환하고, 그렇지 않으면 false를 반환한다.

이 메서드는 정수 입력 여부를 미리 확인할 수 있기 때문에, 잘못된 입력(예: 문자열이나 소수)을 받았을 때 예외를 발생시키지 않고, 적절한 오류 메시지를 출력하여 다시 입력을 받는 데 유용하다.


코드 예시:

public class App {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        Scanner sc = new Scanner(System.in);

        while (true) {
            int num1 = 0, num2 = 0;

            // 첫 번째 숫자 입력
            while (true) {
                System.out.print("첫 번째 숫자를 입력하세요(0을 포함한 양의 정수): ");
                if (sc.hasNextInt()) {
                    num1 = sc.nextInt();
                    if (num1 >= 0) {
                        break; // 양의 정수일 경우 루프 탈출
                    } else {
                        System.out.println("0 또는 양의 정수를 입력해주세요.");
                    }
                } else {
                    System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
                    sc.next(); // 잘못된 입력 처리
                }
            }

            // 두 번째 숫자 입력
            while (true) {
                System.out.print("두 번째 숫자를 입력하세요(0을 포함한 양의 정수): ");
                if (sc.hasNextInt()) {
                    num2 = sc.nextInt();
                    if (num2 >= 0) {
                        break; // 양의 정수일 경우 루프 탈출
                    } else {
                        System.out.println("0 또는 양의 정수를 입력해주세요.");
                    }
                } else {
                    System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
                    sc.next(); // 잘못된 입력 처리
                }
            }

            // 이후 연산 및 계산 결과 출력
            System.out.print("사칙연산 기호를 입력하세요(+, -, *, /): ");
            char operator = sc.next().charAt(0);
            try {
                calc.setResults(num1, num2, operator);
                System.out.println("결과: " + calc.getResults());
            } catch (ArithmeticException e) {
                System.out.println(e.getMessage());
                continue;
            }

            // exit 입력 시 종료
            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
            String nextLine = sc.next();
            if (nextLine.equals("exit")) {
                System.out.println("계산기를 종료합니다.");
                break;
            }
        }
        sc.close();
    }
}

주요 변경 사항:

  1. hasNextInt() 사용: hasNextInt()로 입력값이 정수인지 확인 후, 정수가 아닐 경우 오류 메시지를 출력하고 다시 입력받도록 처리하였다.
  2. 양의 정수 검증: 정수가 입력되었을 때 if (num1 >= 0)로 양의 정수인지 확인하고, 음수가 입력되면 다시 입력을 받도록 했다.
  3. 오류 처리 및 반복 입력: 잘못된 입력이 들어올 때마다 sc.next()를 통해 입력 버퍼를 정리하고, 유효한 입력이 들어올 때까지 반복하는 구조로 구현하였다.

결론

이번 트러블 슈팅을 통해 양의 정수만 입력받는 요구 사항을 제대로 반영할 수 있었으며, 입력값에 대한 검증을 강화하여 프로그램의 안정성을 높일 수 있었다. hasNextInt()if문을 적절히 사용하여 사용자의 잘못된 입력을 걸러내는 방식을 터득한 좋은 경험이었다.

profile
서두르지 않으나 쉬지 않고

0개의 댓글