첫 번째 문자, 연산자, 두 번째 문자가 문자열로 입력됨. 유효성 검사를 한 뒤 숫자와 연산자로 변환하여 계산한 값을 반환한다. 이때, 입력된 값이 숫자나 연산자가 아닐 경우 예외 처리
package WEEK04.HW_04;
import WEEK03.HW3.AddOperation;
import WEEK03.HW3.DivideOperation;
import WEEK03.HW3.MultiplyOperation;
import WEEK03.HW3.SubstractOperation;
import java.util.regex.Pattern;
public class Parser {
private static final String OPERATION_REG = "[+\\-*/]";
private static final String NUMBER_REG = "^[0-9]*$";
private final Calculator calculator = new Calculator();
public void parseFirstNum(String firstInput) throws BadInputException {
if(!Pattern.matches(NUMBER_REG, firstInput)){
throw new BadInputException("숫자");
}
calculator.setFirstNumber(Integer.parseInt(firstInput));
}
public void parseSecondNum(String secondInput) throws BadInputException {
if(!Pattern.matches(NUMBER_REG, secondInput)){
throw new BadInputException("숫자");
}
calculator.setSecondNumber(Integer.parseInt(secondInput));
}
public void parseOperator(String operationInput) throws BadInputException {
if(!Pattern.matches(OPERATION_REG, operationInput)){
throw new BadInputException("연산자");
}
switch (operationInput){
case "+" :
calculator.setOperation(new AddOperation());
break;
case "-" :
calculator.setOperation(new SubstractOperation());
break;
case "*" :
calculator.setOperation(new MultiplyOperation());
break;
case "/" :
calculator.setOperation(new DivideOperation());
break;
}
}
public double executeCalculator() {
return calculator.calculate();
}
}
Main에서 계산기를 실행하고 예외가 발생할 경우 에러 메세지 출력
public class Main {
public static void main(String[] args) throws Exception {
boolean calculateEnded = false;
CalculatorApp calculatorApp = new CalculatorApp();
try{
calculatorApp.start();
} catch (Exception e){
System.out.println(e.getMessage());
}
}
}
메서드에서 Parser를 리턴하고 있다. 나는 return 값 없이 실행되도록 구현했다.
Q. 리턴값이 사용되지 않은데 왜일까?
A. setter를 통해 해당 객체의 설정값이 변경되었으므로 객체를 반환해줌. 다만 이 코드에서는 리턴값이 사용되지 않으므로 void여도 상관없음.
메서드 throws Excepion → 에러 발생시 BadInputException 객체 생성 : 더 유연한 코딩이 가능할 것 같다.
boolean 변수와 while문을 활용해 에러가 발생하더라도 다시 입력 받을 수 있도록 함 : 내 코드의 경우 에러가 나면 바로 종료.
Q. CalculatorApp.start() 메서드가 항상 true를 리턴하고 있는데 그냥 while(true)로 실행하는 것과는 다른가?
A. CalculatorApp.start() 메서드가 실행이 끝나면 끝났음을 알리기 위해 true를 리턴하고 while문은 false인 동안 실행된다. 즉 사용자의 입력을 받기 위해 대기하는 부분(에러가 나면 재실행 되는 부분)을 구현한 것이므로 while(true)로 실행하는 것과는 다르다.
import java.util.regex.Pattern;
public class Parser {
private static final String OPERATION_REG = "[+\\-*/]";
private static final String NUMBER_REG = "^[0-9]*$";
private final Calculator calculator = new Calculator();
public Parser parseFirstNum(String firstInput) throws Exception{
if (!Pattern.matches(NUMBER_REG, firstInput)) {
throw new BadInputException("정수값");
}
this.calculator.setFirstNumber(Integer.parseInt(firstInput));
return this;
}
public Parser parseSecondNum(String secondInput) throws Exception {
if (!Pattern.matches(NUMBER_REG, secondInput)) {
throw new BadInputException("정수값");
}
this.calculator.setSecondNumber(Integer.parseInt(secondInput));
return this;
}
public Parser parseOperator(String operationInput) throws Exception {
if (!Pattern.matches(OPERATION_REG, operationInput)) {
throw new BadInputException("사칙 연산의 연산자");
}
switch (operationInput) {
case "+" -> this.calculator.setOperation(new AddOperation());
case "-" -> this.calculator.setOperation(new SubstractOperation());
case "*" -> this.calculator.setOperation(new MultiplyOperation());
case "/" -> this.calculator.setOperation(new DivideOperation());
}
return this;
}
public double executeCalculator() {
return calculator.calculate();
}
}
public class Main {
public static void main(String[] args) {
boolean calculateEnded = false;
while (!calculateEnded) {
try {
calculateEnded = CalculatorApp.start();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}