Everyday Dev System

4주차 과제 : 계산기 예외 처리 본문

내배캠 초기 학습/Java 문법 종합반

4주차 과제 : 계산기 예외 처리

chaeyoung- 2023. 5. 26. 13:28

 

File Share : (아래 링크에서 다운로드 가능합니다)

공유 링크  : https://drive.google.com/file/d/1sdRS0nMQtI_LzoAD99FFHptmGBRKzbNv/view?usp=sharing 

 

exceptSample.zip

 

drive.google.com

 

 

1. AbstractOperation.java

2. AddOperation.java

3. DivideOperation.java

4. ModOperation.java

5. MultiplyOperation.java

6. SubstractOperation.java

7. BadInputException.java

8. Calculator.java

9. CalculatorApp.java

10. Parser.java

11. Main.java

 

 

 

 

 

 

1. AbstractOperation.java

package org.example.week4.exceptSample;

public abstract class AbstractOperation {
    abstract double operate(int firstNumber, int secondNumber);
}

 

2. AddOperation.java

package org.example.week4.exceptSample;

public class AddOperation extends AbstractOperation {
    @Override
    public double operate(int firstNumber, int secondNumber) {
        return firstNumber + secondNumber;
    }
}

 

3. DivideOperation.java

package org.example.week4.exceptSample;

public class DivideOperation extends AbstractOperation {
    @Override
    public double operate(int firstNumber, int secondNumber) {
        return firstNumber/secondNumber;
    }
}

 

4. ModOperation.java

package org.example.week4.exceptSample;

public class ModOperation extends AbstractOperation {
    @Override
    public double operate(int firstNumber, int secondNumber) {
        return firstNumber%secondNumber;
    }
}

 

5. MultiplyOperation.java

package org.example.week4.exceptSample;

public class MultiplyOperation extends AbstractOperation {
    @Override
    public double operate(int firstNumber, int secondNumber) {
        return firstNumber * secondNumber;
    }
}

 

6. SubstractOperation.java

package org.example.week4.exceptSample;

public class SubstractOperation extends AbstractOperation {
    @Override
    public double operate(int firstNumber, int secondNumber) {
        return firstNumber-secondNumber;
    }
}

 

7. BadInputException.java

package org.example.week4.exceptSample;

public class BadInputException extends Exception{
    public BadInputException(String type) {
        super("잘못된 입력입니다. " + type + "을 입력해주세요.");
    }
}

 

8. Calculator.java

package org.example.week4.exceptSample;

public class Calculator {
    private int firstNumber;
    private int secondNumber;

    private AbstractOperation operation;

    public Calculator(AbstractOperation operation) {
        this.operation = operation;
    }

    public Calculator() {
    }

    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 int getFirstNumber() {
        return firstNumber;
    }

    public int getSecondNumber() {
        return secondNumber;
    }

    public AbstractOperation getOperation() {
        return operation;
    }

    public double calculate() {
        double answer = 0;
        answer = operation.operate(this.firstNumber, this.secondNumber);
        return answer;
    }

}

 

9. CalculatorApp.java

package org.example.week4.exceptSample;

import java.util.Objects;
import java.util.Scanner;

public class CalculatorApp {
    private static boolean firstNumEnded = false;
    private static boolean operatorEnded = false;
    private static boolean secondNumEnded = false;
    private static Parser parser = new Parser();

    public static boolean start() throws Exception{
        Scanner scanner = new Scanner(System.in);

        // 첫번째 피연산자 입력 받기
        while(!firstNumEnded) {
            firstNumResult();
        }

        // 연산 기호 입력 받기
        while(!operatorEnded) {
            operatorResult();
        }

        // 두번째 피연산자 입력 받기
        while(!secondNumEnded) {
            secondNumResult();
        }

        // 연산 결과 출력
        System.out.println(parser.getCalculator().getFirstNumber() + ", " + parser.getCalculator().getSecondNumber());
        System.out.println("연산 결과 : " + parser.executeCalculator());
        return true;

    }

    private static void secondNumResult() throws Exception{
        Scanner scanner = new Scanner(System.in);

        System.out.println("두번째 숫자를 입력해주세요!");
        String secondInput = scanner.nextLine();
        parser.parserSecondNum(secondInput);
        Integer i = parser.getCalculator().getSecondNumber();
        if(i != null) {
            //System.out.println(secondInput);
            secondNumEnded = true;
        }
    }

    private static void operatorResult() throws Exception{
        Scanner scanner = new Scanner(System.in);

        System.out.println("연산자를 입력해주세요!");
        String operator = scanner.nextLine();
        parser.parserOperator(operator);
        AbstractOperation aO = parser.getCalculator().getOperation();
        if(!Objects.isNull(aO)) {
            //System.out.println(operator);
            operatorEnded = true;
        }
    }

    public static void firstNumResult() throws Exception{
        Scanner scanner = new Scanner(System.in);

        System.out.println("첫번째 숫자를 입력해주세요!");
        String firstInput = scanner.nextLine();
        parser.parserFirstNum(firstInput);
        Integer i = parser.getCalculator().getFirstNumber();
        if(i != null) {
            //System.out.println(firstInput);
            firstNumEnded = true;
        }
    }
}

 

10. Parser.java

package org.example.week4.exceptSample;

import java.util.regex.Pattern;
public class Parser {
    // 그렇다면 이 클래스에서
    // 우리의 메소드가 위험하다는 사실을 알려야 한다 !
    // https://yoonhoou.tistory.com/entry/Java-%EC%9E%90%EB%B0%94-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-Pattern-Matcher
    private static final String OPERATION_REG = "[+\\-*/]"; // \\- : ^ , - 를 [] 안에서 나타내기
    private static final String NUMBER_REG = "^[0-9]*$";  // ^는 우선 패턴의 시작, [0-9] 0부터 9까지
    // *는 앞의 문자가 없을수도 많을수도, $는 패턴의 끝
    private final Calculator calculator = new Calculator();

    public Parser parserFirstNum(String firstInput) throws BadInputException {
        if (Pattern.matches(NUMBER_REG, firstInput)) {
            calculator.setFirstNumber(Integer.parseInt(firstInput));
            return this;
        } else {
            throw new BadInputException("숫자");
        }
    }

        public Parser parserSecondNum (String secondInput) throws BadInputException {
            if (Pattern.matches(NUMBER_REG, secondInput)) {
                calculator.setSecondNumber(Integer.parseInt(secondInput));
                return this;
            } else {
                throw new BadInputException("숫자");
            }
        }

        public Parser parserOperator (String operationInput) throws BadInputException {
            if (Pattern.matches(OPERATION_REG, operationInput)) {
                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;
                    case "%":
                        calculator.setOperation(new ModOperation());
                        break;
                }
            } else {
                throw new BadInputException("연산 기호");
            }
            return this;
        }

    public Calculator getCalculator() {
        return calculator;
    }

    public double executeCalculator () {
            return calculator.calculate();
        }
    }

 

11. Main.java

package org.example.week4.exceptSample;

public class Main {
    public static void main(String[] args) throws Exception {
        boolean calculateEnded = false;
        // 구현 2.

        // 계산 완료될 때까지 반복
        while(!calculateEnded) {
            try {
                calculateEnded = CalculatorApp.start();
            } catch (BadInputException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

'내배캠 초기 학습 > Java 문법 종합반' 카테고리의 다른 글

3주차 과제 - 계산기 구현  (0) 2023.05.25
4주차 공부 - List 타입  (0) 2023.05.24
4주차 공부 - Generic  (0) 2023.05.24
4주차 공부 - 예외처리  (0) 2023.05.24
Java 문법 종합반 - 1,2주차  (2) 2023.05.22