TIL
[TIL] 240429 <자바> 계산기 예외 처리
- -
*변경됨*
Calculator.java
package week04.homework4;
// 변경됨
public class Calculator {
// AddOperation,SubstractOperation,MultiplyOperation,DivideOperation클래스들은
// AbstractOperation 추상클래스를 상속함!
//Calculator클래스는 4개의 연산클래스들이 상속받고있는 AbstractOperation 클래스만 포함!!!
private AbstractOperation operation;
//추가됨
private int firstNumber;
private int secondNumber;
// Calculator 생성자
public Calculator(AbstractOperation operation){
this.operation = operation;
}
// 추가됨
public Calculator(){
}
// setter
public void setOperation (AbstractOperation operation){
this.operation = operation;
}
//추가됨
public void setFirstNumber(int firstNumber) {
this.firstNumber = firstNumber;
}
public void setSecondNumber(int secondNumber) {
this.secondNumber = secondNumber;
}
//더 이상 연산자 타입을 받아 구분할 필요가 없어짐
//public double calculate (int num1, int num2) {
//변경됨
public double calculate() {
double result = 0;
//result = operation.operate(num1,num2);
//변경됨
result = operation.operate(this.firstNumber, this.secondNumber);
return result;
}
}
*추가됨*
BadInputException.java
package week04.homework4;
// 예외 클래스
public class BadInputException extends Exception {
public BadInputException(String type) {
super("잘못된 입력입니다! " + type + "을 입력해주세요!");
}
}
+)
계산기 예외처리
Step1.
CalculatorApp을 사용하여 Main 클래스 작성
CalculatorApp.java
package week04.homework4;
import java.util.Scanner;
public class CalculatorApp { //계산기를 실행시켜줌
public static boolean start() throws Exception{ //위험하다는 flag
Parser parser = new Parser(); //Parser 인스턴스
Scanner scanner = new Scanner(System.in);
//유저입력을 String으로만 받기 때문에 파싱과정 필요!!
System.out.println("첫번째 숫자를 입력해주세요!");
String firstInput = scanner.nextLine();
parser.parseFirstNum(firstInput); //문자입력받아서 첫번째숫자로 변환
System.out.println("연산자를 입력해주세요!");
String operator = scanner.nextLine();
parser.parseOperator(operator); //문자입력받아서 오퍼레이터로 변환
System.out.println("두번째 숫자를 입력해주세요!");
String secondInput = scanner.nextLine();
parser.parseSecondNum(secondInput); //문자입력받아서 두번째숫자로 변환
System.out.println("연산 결과 : " + parser.executeCalculator());
return true;
}
}
Main.java : try-catch 사용하여 예외처리
package week04.homework4;
// 변경됨
public class Main {
public static void main(String[] args) {
boolean calculateEnded = false;
while(!calculateEnded){
try{
calculateEnded = CalculatorApp.start();
//start() 실행 후 calculateEnded값이 true가 되면 !calculateEnded가 false이므로
// 다음 while문 실행되지 않음
} catch(Exception e){ //예외 발생 시 메시지
System.out.println(e.getMessage());
}
}
}
}
Step2.
CalculatorApp에서 문자열을 입력받아 int 혹은 operator로 파싱할때 사용하는 Parser.java 코드 작성
Parser.java
- Pattern.matches(String 정규식, CharSequence 비교할값) : 정규식과 값을 비교하여 boolean값을 반환
- Integer.parseInt(String값) : String값을 Int로 파싱시켜줌
package week04.homework4;
import java.util.regex.Pattern; //matches(정규식,비교할값) 사용 위함
public class Parser {
// 정규식
private static final String OPERATION_REG = "[+\\-*/]"; //오퍼레이터
private static final String NUMBER_REG = "^[0-9]*$"; //숫자
private final Calculator calculator = new Calculator(); //Calculator 인스턴스 사용할 것임
public Parser parseFirstNum(String firstInput) throws Exception{
// Pattern.matches(String 정규식, CharSequence 비교할값)
if (!Pattern.matches(NUMBER_REG, firstInput)) { //숫자정규식과 값이 매치하지 않을 시
throw new BadInputException("정수값"); //예외처리
}
// Integer.parseInt(String값) : String값을 Int로 파싱시켜줌
this.calculator.setFirstNumber(Integer.parseInt(firstInput)); //calculator의 setter 사용
return this; //Parser 반환
}
public Parser parseSecondNum(String secondInput) throws Exception {
// Pattern.matches(String 정규식, CharSequence 비교할값)
if (!Pattern.matches(NUMBER_REG, secondInput)) { //숫자정규식과 값이 매치하지 않을 시
throw new BadInputException("정수값"); //예외처리
}
// Integer.parseInt(String값) : String값을 Int로 파싱시켜줌
this.calculator.setSecondNumber(Integer.parseInt(secondInput)); //calculator의 setter 사용
return this; //Parser 반환
}
public Parser parseOperator(String operationInput) throws Exception {
// Pattern.matches(String 정규식, CharSequence 비교할값)
if (!Pattern.matches(OPERATION_REG, operationInput)) { //오퍼레이터 정규식과 값이 매치하지 않을 시
throw new BadInputException("사칙 연산의 연산자"); //예외처리
}
switch (operationInput) { //calculator의 setter 사용
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; //Parser 반환
}
public double executeCalculator() {
return calculator.calculate();
}
}
실행 결과
'TIL' 카테고리의 다른 글
[TIL] 240501 <자바> 쓰레드 (1) | 2024.05.01 |
---|---|
[TIL] 240430 <자바> 제네릭 (0) | 2024.04.30 |
[TIL] 240428 <자바> 예외처리 (0) | 2024.04.29 |
[TIL] 240426 <자바> 계산기 만들기 (0) | 2024.04.26 |
[TIL] 240425 <자바> 상속,인터페이스 (1) | 2024.04.25 |
Contents
소중한 공감 감사합니다