본문 바로가기
TIL

JAVA 계산기 과제 - level 1 트러블슈팅

by suyeoneee 2024. 11. 20.

내일배움캠프 시작 후 첫 개인 과제! 바로 계산기 프로그램을 만드는 과제가 나에게 주어졌다!

이 과제에는 총 레벨3까지 있으며, 레벨1~2까지는 필수 기능을 구현하는 단계이고 레벨3은 도전 기능이 추가된 단계이다.

계산기는 클래스를 활용한 계산기사용하지 않는 계산기 두 가지 모두 구현해야 할 것이며, 이 과제를 통해 자바의 기본 문법과 객체 지향 프로그래밍의 개념을 이해하는 것이 목표이다.

 

Level 1. 클래스없이 기본적인 연산을 수행할 수 있는 계산기 만들기

📋 요구사항

  • 양의 정수(0포함)를 입력받기
  • 사칙연산(+, -, *, /)를 입력받기
  • 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력하기
  • 반복문을 사용하되, 반복의 종료를 알려주는 "exit"문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드를 수정하기 (제일 마지막에)

 

❕예외 처리

  • 숫자 입력 시, 다른 타입을 입력했을 때
    • InputMismatchException 처리
    • try {숫자 입력, 변수에 저장} - catch (InputMismatchException){오류 출력, 숫자입력} - finally{sc.nextLine();}
  • 0포함 양의 정수 입력
    • if문으로 음수인지 확인하여 음수인 경우에는 Exception을 발생시켜서 입력을 다시 받을 수 있도록 했다.
// 음수인지 확인 (try문)
if(firstNum < 0 || secondNum < 0)
	throw new InputMismatchException();
  • 0으로 나누기
    • 마찬가지로, 0으로 나누기를 할 수 없는 조건이면 입력을 다시 받을 수 있도록 했다.
case '/':
    if (secondNum == 0) {
        System.out.println("나눗셈 연산에서 두 번째 정수에 0이 입력될 수 없습니다. 다시 입력하세요.");
        continue; // while 반복문 처음으로 돌아가서 다시 입력받기
    }

 

  • 사칙연산 기호 입력 시, 기호가 아닌 다른 입력을 했을 때
    • do-while 문으로 조건에 맞는 사칙연산 기호를 입력할 때까지 입력 요청
do {
    System.out.print("사칙연산 기호를 입력하세요: ");
    operator = sc.nextLine().charAt(0);
} while (operator != '+' && operator != '-' && operator != '*' && operator != '/');
  • “exit” 문자열을 입력하기 전까지 계산을 무한으로 진행
    • "exit" 문자열을 입력하면 반복문 break;를 만나 종료하게 된다.
System.out.println("계산 결과: " + result);
System.out.print("더 계산하시겠습니까? (exit 입력 시 종료) : ");

if (sc.nextLine().equals("exit")) {
	sc.close();
	break;
} // "exit" 입력 시 반복 종료*

result = 0; // 계산 결과 초기화

 

🌀 트러블 슈팅

1. 문제 상황 발생

Scanner로 숫자 입력을 받고 사칙연산 기호를 입력받으려고 할 때 에러가 발생한다.

 

2. 원인 추론

아직 문자 입력하기 전인데 빈 문자열에서 값을 가져오려고 하는건가? 

char형의 operator 변수는 sc.nextLine().charAt(0); 으로 값을 가져오는데 sc.nextLine() 에서 에러가 발생하는 것 같다.

문자 입력하기 전에 숫자를 먼저 입력하고 나서 엔터를 치는데.. 이렇게 줄바꾼 걸 nextLine()에서 반응하는 것 같다!

 

3. 해결 방안

기호 입력하기 전에 스캐너를 불러서 버퍼를 비워야겠다.

try {
    System.out.print("첫 번째 숫자를 입력하세요: ");
    firstNum = sc.nextInt();

    System.out.print("두 번째 숫자를 입력하세요: ");
    secondNum = sc.nextInt();

    // 음수인지 확인
    if (firstNum < 0 || secondNum < 0)
        throw new InputMismatchException();
} catch (InputMismatchException e) {
    System.out.println("잘못된 입력입니다. 처음으로 돌아갑니다.");
    continue;
} finally {
    sc.nextLine();
}

System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.nextLine().charAt(0);

 

4. 결과 확인

에러가 나지 않고 nextLine()이 잘 실행된다.

자세히 알아보니 nextInt(), nextDouble() 등 숫자를 읽는 메서드와 함께 사용 시, 입력 버퍼에 남아있는 **줄바꿈 문자(\n)**로 인해 nextLine()이 의도치 않게 실행되거나 빈 입력을 읽는 문제가 생길 수 있다고 한다.! 이 문제는 위와 같이 줄바꿈 문자를 소비하는 방식으로 해결할 수 있다.

댓글