내일배움캠프 시작 후 첫 개인 과제! 바로 계산기 프로그램을 만드는 과제가 나에게 주어졌다!
이 과제에는 총 레벨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()이 의도치 않게 실행되거나 빈 입력을 읽는 문제가 생길 수 있다고 한다.! 이 문제는 위와 같이 줄바꿈 문자를 소비하는 방식으로 해결할 수 있다.
'TIL' 카테고리의 다른 글
14일차) 자바 동등성과 동일성 , equals()와 hashCode() (0) | 2024.11.22 |
---|---|
Java 계산기 과제 - level 2 트러블슈팅 (0) | 2024.11.20 |
10일차) (1) | 2024.11.15 |
9일차) 자바 3주차 숙제 (1) | 2024.11.14 |
8일차) 자바 문법 종합반 3주차 (0) | 2024.11.13 |
댓글