- main 메서드에서 다른 클래스의 메서드를 사용하기 위해 남발했던 static 키워드를 제거하고 객체를 만들어서 메서드를 실행시켰다.
- 2개의 숫자만 계산할 수 있었던 프로그램에서 연속으로 사용자 입력을 받아 계산할 수 있는 프로그램으로 개선시켰다.
- 계산기 프로그램을 구현할 때는 테스트 코드를 작성하지 못 했으므로 프로덕션 코드만 기록하도록 해야겠다.
실행흐름.
- 사용자가 첫 번째 숫자를 입력한다.
- 연산기호를 입력한다.
- 두 번째 숫자를 입력한다.
- 중간 연산값을 출력한다.
- 연산을 끝낼 것인지 계속할 것인지 입력한다.
- end를 입력하면 최종 결과 값이 나온다.
- 연산 기호를 입력하면 연산을 계속 진행한다.
아쉬운 점
- 테스트 코드를 통해 프로덕션 코드를 만들지 못했다. 어떻게 테스트 코드를 작성해야 하는지 어려움이 있다.
- 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);
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;
}
}