계산기 작성 With Exception

이동규·2023년 4월 9일

JAVA

계산기 작성 코드

  • calculator + calculatorApp
package Calculator;

import lombok.AllArgsConstructor;

@AllArgsConstructor
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 double calculate() {
        double answer = 0;
        answer = operation.operate(this.firstNumber, this.secondNumber);
        return answer;
    }
}
  • Parser 코드 *

    //private final Calculator calculator = new Calculator();
    private final Calculator calculator = new Calculator(new AddOperation());

    public Parser parseOperator(String operationInput) throws Exception{
        // 구현 1.
        if(!Pattern.matches(OPERATION_REG, operationInput)){
            throw new BadInputException("연산자");
        }
        
        AbstractOperation operation;
        
        switch (operationInput){
            case "+":
                operation = new AddOperation();
                break;
            case "-":
                operation = new SubOperation();
                break;
            case "*":
                operation = new MultiOperation();
                break;
            case "/":
                operation = new DIvOperation();
                break;
            default:
                throw new BadInputException("잘못된 연산자입니다.");
        }
        this.calculator.setOperation(operation);
        
//        switch (operationInput){
//            case "+" -> this.calculator.setOperation(new AddOperation());
//            case "-" -> this.calculator.setOperation(new SubOperation());
//            case "*" -> this.calculator.setOperation(new MultiOperation());
//            case "/" -> this.calculator.setOperation(new DIvOperation());
//        }

        return this;
    }

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

문제점

  • Calculator Class 속 생성자 두개를 생성된 것을 확인할 수 있음
    • 이때 public Calculator() { } 기본 생성자를 이용해서 Parser 코드 속에 인스턴스화를 진행하면 정상적으로 setOperation 메서드가 실행되는 것을 알 수 있다.
  • 하지만, 추상 클래스를 매개로 받는 생성자를 사용할 경우, 과연 코드를 어떻게 변경하고 둘 다 사용을 할 수 있는지 고민해 봄

시도 + 해결

  • private final Calculator calculator = new Calculator(new AddOperation()); 이 처럼 필드 영역에 Calculator Class를 객체화 시키고 추상 클래스 선언에 어떤 것을 선언해야 할지 막힘
  • 이때 추상 클래스를 매개변수를 받는다면 추상 클래스의 하위 클래스 중에 찾아볼 수 있다는 것을 깨닳음
  • 그렇게 하위 클래스 중 AddOperation()을 선언해 줌으로써 동작 가능해짐

알게된 점

  • 생성자에 추상 클래스로 매개 변수를 지정하고 생성자를 생성할 경우 기본 생성자로 생성할 때와 달리 매번 setOperation 메서드 호출을 줄일 수 있다는 것을 알았다.
  • 또한, 기본 생성자와 달리 AbstractOperation operation; 속 operation을 통해 하위 클래스를 선언해주는 방식으로 사칙연산 클래스를 불러들인다.
  • 자바 static 메서드 스프링 부트 static 메서드
profile
진짜 개발자가 되고 싶다

0개의 댓글