Lv1. 클래스 없이 기본적인 연산을 수행할 수 있는 계산기 만들기
- Lv1.java
package Lv1;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Lv1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
int num1 = 0;
int num2 = 0;
String operator = "";
double answer = 0;
boolean validInput = false;
// 양의 정수 입력받기
while (!validInput) {
try {
System.out.print("양의 정수를 입력해주세요(1/2):");
num1 = scanner.nextInt(); // 첫 번째 정수 입력
if (num1 < 0) {
System.out.println("양의 정수를 입력해야 합니다. 다시 입력해주세요.");
} else {
validInput = true; // 유효한 입력
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
scanner.next();
}
}
validInput = false; // 루프용 boolean 초기화
while (!validInput) {
try {
System.out.print("양의 정수를 입력해주세요(2/2):");
num2 = scanner.nextInt(); // 두 번째 정수 입력
if (num2 < 0) {
System.out.println("양의 정수를 입력해야 합니다. 다시 입력해주세요.");
} else {
validInput = true; // 유효한 입력
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 정수를 입력해주세요.");
scanner.next();
}
}
validInput = false; // 루프용 boolean 초기화
scanner.nextLine(); // 남아있는 줄바꿈 제거
// 사칙연산 기호 입력받기
while (!validInput) {
System.out.print("사칙연산 기호를 입력해주세요(+-*/):");
operator = scanner.nextLine();
// 연산하기
switch (operator) {
case "+":
answer = num1 + num2;
validInput = true;
break;
case "-":
answer = num1 - num2;
validInput = true;
break;
case "*":
answer = num1 * num2;
validInput = true;
break;
case "/":
if (num2 == 0) {
System.out.println("0으로 나눌 수 없습니다. 다시 입력해주세요.");
} else {
answer = (double) num1 / num2;
validInput = true;
}
break;
default:
System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
}
}
// 결과 출력하기
System.out.println(num1 + operator + num2 + "=" + answer);
// exit 입력시 루프 탈출
System.out.print("계속 하시겠습니까?(종료:exit):");
String exit = scanner.nextLine();
if (exit.equalsIgnoreCase("exit")) { // 대소문자 구분 없이 처리
System.out.println("프로그램을 종료합니다. 감사합니다!");
break;
}
}
scanner.close();
}
}
Lv 1. 의 과제는 되게 쉬웠습니다. 양의 정수를 입력받고, 사칙연산 기호 입력받아서 기호별로 다른 계산을 시키고 출력. 그리고 전체를 while(true)로 감싸서 exit을 입력할 때까지 반복하는 계산기를 만드는 거였습니다.
하지만 그냥 기능 자체만 만든다면 재미가 없겠지요. 발생할 수 있는 모든 예외의 경우에 대한 오류 메시지를 출력하고, 다시 입력하도록 만들었습니다.
validInput의 문제점
정수, 사칙연산 입력 부분을 전부 while문으로 감싸고, 이를 나가기 위한 조건으로 validInput boolean을 만들었습니다. 유효한 값을 입력하여 true가 되어야 루프를 탈출할 수 있습니다. 루프를 탈출하고 나면 다시 validInput = false;로 초기화를 시켜야 한다는 문제점이 있지만 사칙연산 기호를 입력받을 때 while문 안에 switch문이 있어 break;로 탈출하기에는 조금 복잡해져서 사용했습니다.
exit 입력의 문제점
exit 입력으로 종료를 할 때에 다들 소문자 "exit"을 사용하실 겁니다. 하지만 저 같은 경우 Caps Lock을 한 번씩 사용하기에 이때 "EXIT"으로 입력됩니다. 이때 문제점은 분명 같은 exit인데 같은 String으로 받아들여지지 않는다는 것입니다. 따라서 equalsIgnoreCase를 사용하여 대소문자 상관없이 exit을 입력하면 종료할 수 있도록 만들었습니다.
남아있는 줄 바꿈 제거
제가 scanner.nextLine();를 중간에 써놓은 것을 볼 수 있으실 겁니다. 줄 바꿈을 하지 않으면 정수를 다 입력한 후 사칙연산 기호를 입력해야하는데 바로 넘어가버립니다. 이유는 nextInt()와 nextLine()의 작동방식이 다르기 때문입니다.
scanner.nextInt()는 숫자만 읽어오고, 입력 버퍼에 남아 있는 줄바꿈 문자(\n)를 처리하지 않습니다. 즉, 사용자가 숫자를 입력한 뒤 Enter 키를 누르면, 숫자만 읽고 줄바꿈 문자는 버퍼에 남아 있게 됩니다.
scanner.nextLine()은 버퍼에 남아 있는 모든 내용을 읽어옵니다. 따라서 이전의 nextInt() 호출 이후 버퍼에 남아 있던 \n을 처리하기 위해 nextLine()을 호출해야 합니다.
'Sparta' 카테고리의 다른 글
Ch2 계산기 과제 Lv3. (0) | 2024.11.18 |
---|---|
Ch2 계산기 과제 Lv2. (0) | 2024.11.18 |
TIL(Today I Learned)_24.11.04.mon (0) | 2024.11.04 |
TIL(Today I Learned)_24.11.02.Sat (0) | 2024.11.02 |
TIL(Today I Learned)_사전캠프_5일차_24.11.01.Fri (0) | 2024.11.01 |