2.1 계산기 구현 Refactoring(static 최소화, 연속연산 기능 추가)

choizz156·2022년 8월 15일
0

TDD

목록 보기
6/6
post-thumbnail
  • main 메서드에서 다른 클래스의 메서드를 사용하기 위해 남발했던 static 키워드를 제거하고 객체를 만들어서 메서드를 실행시켰다.
  • 2개의 숫자만 계산할 수 있었던 프로그램에서 연속으로 사용자 입력을 받아 계산할 수 있는 프로그램으로 개선시켰다.
  • 계산기 프로그램을 구현할 때는 테스트 코드를 작성하지 못 했으므로 프로덕션 코드만 기록하도록 해야겠다.

실행흐름.

  1. 사용자가 첫 번째 숫자를 입력한다.
  2. 연산기호를 입력한다.
  3. 두 번째 숫자를 입력한다.
  4. 중간 연산값을 출력한다.
  5. 연산을 끝낼 것인지 계속할 것인지 입력한다.
  6. end를 입력하면 최종 결과 값이 나온다.
  7. 연산 기호를 입력하면 연산을 계속 진행한다.

아쉬운 점

  • 테스트 코드를 통해 프로덕션 코드를 만들지 못했다. 어떻게 테스트 코드를 작성해야 하는지 어려움이 있다.
  • 2. 계산기 구현에서 작성했던 코드를 깃허브에 저장했었는데 실수로 날려먹었다. 다시 복붙을 할 수는 있겠지만 굳이 그렇게 하지는 않겠다.

Production Code

  • CalculatorRunner 클래스에서 while문을 추가해 연속연산을 가능하게 한다.
package calculator;

import java.util.Scanner;

public class CalculatorRunner {

    public static void main(String[] args) {
        Comments comments = new Comments();
        OperatorException operatorException = new OperatorException();
        Output output = new Output();
        Scanner scanner = new Scanner(System.in);

        comments.numberInputComment();
        double first = scanner.nextDouble(); // 첫 번째 숫자 입력


        System.out.print("연산 기호를 입력해 주세요 : "); 
        String operatorCheck = scanner.next(); //연산기호 입력

        String operator= operatorException.checkOperator(scanner, operatorCheck); // 연산기호가 올바른지 확인하고 올바르다면 operator에 저장.

        double result = first;// 연속된 연산을 하기 위해 첫 번재 입력값을 다른 변수에 집어 넣는다.
        
        while (true) {

            comments.numberInputComment();
            double second = scanner.nextDouble(); // 두 번째 숫자 입력.

            result = output.output(result, operator, second); // 중간 결과 출력

            System.out.println("최종 결과 값을 원하시면 'end'를 입력해주세요");
            System.out.println("연산을 진행하시려면 연산 기호를 입력해 주세요");
            String operatorCheck2 = scanner.next(); // 연산을 계속할지 결과 값을 출력할지 결정.
            
            if (output.resultOutput(output, result, operatorCheck2)) break; end를 입력한다면 결과값 출력
            
            operator = operatorException.checkOperator(scanner, operator); 연산기호를 입력했다면 올바른 연산기호인지 확인하고 연산 잔행, 재 입력된 연산기호를 다시 operator에 대입.

        }
    }

}



  • Calculator 클래스에서 메서드의 static 키워드를 모두 제거했다.
package calculator;



public class Calculator {
    public  double add(double num1, double num2) {
        String result = String.format("%.2f", num1 + num2);
        return Double.parseDouble(result);
    }
    public  double substract(double num1, double num2) {
        String result = String.format("%.2f", num1 - num2);
        return Double.parseDouble(result);
    }

    public  double multiply(double num1, double num2) {
        String result = String.format("%.2f", num1 * num2);
        return Double.parseDouble(result);
    }

    public  double divide(double num1, double num2) {
        if(num2 == 0){
            System.out.println("0으로 나눌 수 없습니다.");
            return Math.random();
        }

        String result = String.format("%.2f", num1 / num2);
        return Double.parseDouble(result);
    }
}
  • Comments 클래스에서 static키워드를 제거했다.
package calculator;

public class Comments {
    public  void numberInputComment(){
        System.out.print("숫자를 입력해 주세요 : ");
    }

}
  • OperatorException 클래스에서 static키워드를 제거했다.
package calculator;

import java.util.Scanner;

public class OperatorException {
    public  String checkOperator(Scanner scanner, String operator) {
        while (!(isOperator(operator))) {
            System.out.println("올바른 연산 기호를 입력해 주세요(+, - , * ,/) : ");
            operator = scanner.next();
            if (isOperator(operator)) return operator;
        }
        return operator;
    }

    public  boolean isOperator(String operator) {
        if (operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/")) {
            return true;
        }
        return false;
    }

}
  • Output 클래스에서 static 키워드를 제거하고 resultOutput을 만들어 최종 결과값을 얻을지 연산을 계속할지 정하는 코드를 수행한다.
    getresult메서드를 만들어 resultOutput 메서드에서 사용한다. String 을 리턴해서 콘솔에 최종 결과값이 리턴되게 한다.
    static 키워드가 있던 모든 메서드에서 static 키워드를 제거한다.
    void였던 리턴 타입을 double로 바꿔 double형 리턴 값을 나오게해서 연속 연산을 가능하게 한다.

package calculator;

public class Output {
    Calculator calculator = new Calculator();

    public boolean resultOutput(Output output, double result, String operator) {
        if (operator.equals("end")) {
            System.out.println("최종 결과 값은 : " + output.getResult(result) + " 입니다.");
            return true;
        }
        return false;
    }

    public String getResult(double result) {
        String finalResult = String.valueOf(result);
        if (finalResult.contains(".0")) {
            return String.format("%.0f", Double.parseDouble(finalResult));
        }
        return finalResult;
    }
    public double addResult(double first, double second) {
        String result = String.valueOf(calculator.add(first, second));
        if (result.contains(".0")) {
            System.out.println(String.format("%.0f", Double.parseDouble(result)));
        } else {
            System.out.println(calculator.add(first, second));
        }
        return calculator.add(first,second);
    }

    public double substractResult(double first, double second) {
        String result = String.valueOf(calculator.substract(first, second));
        if (result.contains(".0")) {
            System.out.println(String.format("%.0f", Double.parseDouble(result)));
        } else {
            System.out.println(calculator.substract(first, second));
        }
        return calculator.substract(first,second);
    }

    public  double multiplyResult(double first, double second) {
        String result = String.valueOf(calculator.multiply(first, second));
        if (result.contains(".0")) {
            System.out.println(String.format("%.0f", Double.parseDouble(result)));
        } else {
            System.out.println(calculator.multiply(first, second));
        }
        return calculator.multiply(first,second);
    }

    public  double divideResult(double first, double second) {
        String result = String.valueOf(calculator.divide(first, second));
        if (result.contains(".0")) {
            System.out.println(String.format("%.0f", Double.parseDouble(result)));
        } else {
            System.out.println(calculator.divide(first, second));
        }
        return calculator.divide(first,second);
    }
    public  double output(double first, String operator, double second) {
        if (operator.equals("+")) return this.addResult(first, second);
        if (operator.equals("-")) return this.substractResult(first, second);
        if (operator.equals("*")) return this.multiplyResult(first, second);
        if (operator.equals("/")) return this.divideResult(first, second);
      return 0;
    }
}

profile
조금씩 성장하는 개발자...!

0개의 댓글