java

자바 - 계산기 과제 Lv1. 트러블슈팅

에그마요샌드위츼 2025. 3. 1. 03:58

개요

필수 기능 가이드

양의 정수(0 포함) 입력받기

  • 계산기인데 양의 정수만 입력 받을까? 실수도 지원하게 만들어야겠다.
  • 괄호()가 들어가면 연산 우선순위를 어떻게 해야할까?
  •  

사칙연산 기호(➕,➖,✖️,➗)를 입력받기, 적절한 변수에 저장 `charAt(0)`

  • charAt(0)를 사용하는 이유가 뭔지 궁금했다.
  •  

위에서 입력받은 양의 정수 2개와 사칙연산 기호를 사용해 연산을 진행한 후 결과값 출력

반복문을 사용하되, 반복의 종료를 알려주는"exit" 문자열을 입력하기 전까지 무한으로 계산 진행

 

트러블슈팅1 - 개행문자 제거 

 App.java

import java.util.Scanner;

public class App {
    //Lv1. 클래스 없이 기본적인 연산을 수행할 수 있는 계산기 만들기
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            // 양의 정수(0 포함)를 입력받기  
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int num1 = sc.nextInt();
            System.out.print("두 번째 숫자를 입력하세요: ");
            int num2 = sc.nextInt();

            // 사칙연산 기호(➕,➖,✖️,➗)를 입력받기
            System.out.println("사칙연산 기호 입력하기: ");
            // sc를 사용해 사칙연산 기호를 전달받을 수 있음
            // -> charAt(0)의 사용 이유에 대해 알기
            char op = sc.next().charAt(0);

            int result = 0;

            switch (op) {
                case '+':
                    result = num1 + num2;
                    break;
                case '-':
                    result = num1 - num2;
                    break;
                case '*':
                    result = num1 * num2;
                    break;
                case '/':
                    if (num2 == 0) {
                        System.out.println("분모에는 0이 들어갈 수 없습니다");
                    } else {
                        result = num1 / num2;
                    }
            }
            System.out.println("결과: " + result);

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

    }
}

1. 문제 발생

  • 계산까지는 문제가 없었는데 `InputMismatchException` 예외 발생?
  • 저 예외를 찾아보니 정수를 입력받아야 하는데 "exit"문자열을 입력해서 생긴 문제였다
  • 이런 문제는 왜 발생했을까 다시 실행해봤는데 근본적인 문제는 이게 아니라 "exit"를 입력받는 스캐너가 실행되지도 않고 바로 넘어갔다.
  • 해결을 위해 exit를 입력받는 String exitCmd = sc.nextLine(); 부분 확인

2. 접근 방법

  • exit를 입력받는 부분이 잘못됐음을 알았다.
  • nextLine()의 개념을 잘못 이해하고 있는 듯 하여 동작방식에 대해 찾아봤다.
  • nextLine( )은  공백(스페이스 포함)도 포함하여 입력을 받는다고 하는데
  • 바로 위에 라인인  `System.out.println( )` 은 콘솔 출력 후 자동으로 개행문자를 추가한다. 

   문제지점 발견!!!!!

3. 해결 방법

이 문제는 nextLine() 전에 버퍼에 남아있는 개행문자를 처리해주면 해결된다.

1. 입력 전에 nextLine()을 한 번 더 호출하여 버퍼를 비워주는 방법:

sc.nextLine();  // 남아있는 개행문자를 비웁니다.
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
String exitCmd = sc.nextLine();

2. next()로 입력 받기: next()는 공백을 기준으로 입력을 받으므로 개행문자 문제를 피할 수 있다

System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
String exitCmd = sc.next();

 

 

트러블슈팅2 - 사칙연산 기호 잘못 입력 시에 대한 문제 

 

1. 문제 발생

  • 잘못된 연산 기호 입력 시에도 연산이 계속 진행된다. 

2. 접근 방법

  • switch문에서 잘못된 입력을 했을 시에 연산이 진행되지 않도록 해야됐다.
  • default 문은 어떠한 case문과 일치하지 않았을 경우 실행되는 것인데 이부분을 추가하면 될 거 같다.

3. 해결 방법

default:
     System.out.println("연산 기호를 올바르게 입력하세요");
     isValid = false;
     
-------------------------------------------------------------
if(isValid) {
                System.out.println("결과: " + result);
            }
  • isValid 라는 변수를 추가하여 연산이 정상적으로 수행되는 경우엔 true, true일 때만 결과 출력
  • switch문 안에 default를 추가하여 연산 기호가 올바르지 않을 경우 isValid = false; 로 설정해 결과가 출력되지 않게 한다.