💡자바 콘솔로 간단한 사칙연산 계산기 만들기
//Getter, Setter, 생성자
public class CalculatorData {
private int firstNum;
private int secondNum;
private char operator;
private int resultNum;
//스캐너 및 클래스 인스턴스
Scanner sc = new Scanner(System.in);
CalculatorData calData = new CalculatorData();
//첫번째 숫자 입력
int tempNum;
while(true){
System.out.println("\n첫번째 숫자를 입력하세요");
System.out.print("숫자 입력 : ");
try{
tempNum = sc.nextInt();
calData.setFirstNum(tempNum);
break;
}catch (InputMismatchException e){
System.out.println("문자나 기호, 너무 긴 숫자는 입력할 수 없어요.");
sc.nextLine();
}
}
//연산자가 '/' 이고 두번째 숫자가 0이라면 예외처리
if(tempChar == '/' && tempNum == 0) {
System.out.println("0으로 나눌 수 없습니다.");
continue;
}//set으로 연산자 값 미리 생성
static Set<Character> operatorSet = new HashSet<>(Arrays.asList('*', '+', '-', '/'));
char tempChar;
while(true){
System.out.println("\n연산자를 입력하세요");
System.out.print("연산자 입력 : ");
try{
String str = sc.next(); //nextLine > next 로 변경
tempChar = str.charAt(str.length()-1);
if(operatorSet.contains(tempChar)) {
calData.setOperator(tempChar);
break;
}else {
System.out.println("+,-,*,/ 만 입력해주세요");
}
} catch (Exception e) {
System.out.println("+,-,*,/ 만 입력해주세요");
sc.nextLine();
continue;
}
}
//계산 메서드 (계산 Class 부분) -> 오버플로우 방지 throws
public int calculate(CalculatorData calData) throws ArithmeticException{
int resultNum = 0;
int firstNum = calData.getFirstNum();
int secondNum = calData.getSecondNum();
char operator = calData.getOperator(); // [+,-,*,/]
switch (operator){
case '+' : resultNum = Math.addExact(firstNum,secondNum); break;
case '-' : resultNum = Math.subtractExact(firstNum,secondNum); break;
case '*' : resultNum = Math.multiplyExact(firstNum,secondNum); break;
case '/' : resultNum = firstNum / secondNum; break;
}
return resultNum;
}
//계산 메서드 - 입력값 범위 초과시 에러 (Main 부분)
try{
calData.setResultNum(calculator.calculate(calData));
System.out.println("연산 결과 : " + calData.getResultNum());
}catch (ArithmeticException e) {
System.out.println("입력값이 범위를 초과하였습니다.");
System.out.println("다시 입력해 주세요.");
continue;
}
//결과 저장
calculator.getResultStack().push(calData);
//결과들 출력
System.out.println(calculator); // 전체 결과{[연산 결과{ 5 + 6 = 11 }]}
public Calculator removeResult(Calculator cal, Scanner sc){
//데이터 확인
if(cal.getResultStack().isEmpty()) return cal;
//데이터 삭제
int scTemp;
while (true){
System.out.println("\n데이터를 지우시겠습니까?");
System.out.println("최근 데이터 삭제 : 1");
System.out.println("모든 데이터 삭제 : 2");
System.out.println("삭제 안함 : 0");
try {
scTemp = sc.nextInt();
if(scTemp == 1){
cal.getResultStack().pop();
return cal;
} else if (scTemp == 2) {
cal.getResultStack().clear();
return cal;
} else if(scTemp == 0){
return cal;
}
System.out.println("다시 눌러 주세요.");
} catch (Exception e) {
System.out.println("다시 눌러 주세요.");
sc.nextLine();
}
}
}
첫번째 숫자를 입력하세요.
숫자 입력 : 56
연산자를 입력하세요.(+,-,*,/)
연산자 입력 : -
두번째 숫자를 입력하세요.
숫자 입력 : 44
연산 결과 : 12
전체 결과{연산 결과{ 56 - 44 = 12 }]}
문제점
[출력문]
첫번째 숫자를 입력하세요
숫자 입력 : 45
연산자를 입력하세요
연산자 입력 : +,-,*,/ 만 입력해주세요 -> 입력을 하기도 전에 바로 넘어가버림
원인
해결
tempNum = sc.nextInt();
sc.nextLine();
------------------------
String str = sc.nextLine();tempNum = sc.nextInt();
------------------------
String str = sc.next(); //정상적으로 넘어가기는 하지만 비추천try{
tempNum = sc.nextInt();
sc.nextLine();
calData.setFirstNum(tempNum);
break;
}catch (InputMismatchException e){
System.out.println("에러가 났어요.");
sc.nextLine(); // 예외 상황에서도 버퍼를 비울 수 있음
}문제점
Exception in thread "main" java.util.NoSuchElementException원인
해결법