문자열 사칙 연산 계산기 구현
기능 요구사항
•
사용자가 입력한 문자열 값에 따라 사칙연산을 수행할 수 있는 계산기를 구현해야 한다.
•
입력 문자열의 숫자와 사칙 연산 사이에는 반드시 빈 공백 문자열이 있다고 가정한다.
•
나눗셈의 경우 결과 값을 정수로 떨어지는 값으로 한정한다.
•
문자열 계산기는 사칙연산의 계산 우선순위가 아닌 입력 값에 따라 계산 순서가 결정된다. 즉, 수학에서는 곱셈, 나눗셈이 덧셈, 뺄셈 보다 먼저 계산해야 하지만 이를 무시한다.
•
예를 들어 2 + 3 * 4 / 2와 같은 문자열을 입력할 경우 2 + 3 * 4 / 2 실행 결과인 10을 출력해야 한다.
프로그래밍 요구사항
•
indent(들여쓰기) depth를 2단계에서 1단계로 줄여라.
◦
depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다.
•
메소드의 크기가 최대 10라인을 넘지 않도록 구현한다.
◦
method가 한 가지 일만 하도록 최대한 작게 만들어라.
•
else를 사용하지 마라.
피드백
리뷰어 : 전반적인 방향성은 나쁘지 않지만, 요구사항을 충족하지 못하는 부분이 있어 이 부분 개선이 필요해 보입니다. 개선 부탁드립니다.
•
else 사용하지 않는 것이 요구사항 중 하나였던 것으로 알고 있습니다.이 부분 요구사항을 충족하려면 어떻게 설계해야 할까요?
•
연산자 하나하나에 대한 추상화, 그리고 추상화된 연산자를 탐색하는 로직이 구현된 클래스 혹은 메소드 하나가 필요할 것 같습니다. 고민해주시면 감사하겠습니다.
생각정리 : 기능에 집중하다 보니 if else 조건을 놓쳐버렸다.
public String calculator(String leftNumber, String rightNumber) {
Number left = Number.from(leftNumber);
Number right = Number.from(rightNumber);
OperationEnum operationEnum = null;
if ("+".equals(operation)) {
operationEnum = OperationEnum.ADD;
} else if ("-".equals(operation)) {
operationEnum = OperationEnum.MINUS;
} else if ("*".equals(operation)) {
operationEnum = OperationEnum.MULTIPLY;
} else if ("/".equals(operation)) {
operationEnum = OperationEnum.DIVIDE;
}
return String.valueOf(operationEnum.calculator(left.getNumber(), right.getNumber()));
}
JavaScript
복사
•
다음과 같이 변경
public enum OperationEnum {
ADD("+", (number1, number2) -> number1 + number2),
MINUS("-", (number1, number2) -> number1 - number2),
MULTIPLY("*", (number1, number2) -> number1 * number2),
DIVIDE("/", (number1, number2) -> number1 / number2);
private final String operation;
private final IntBinaryOperator expression;
OperationEnum(String operation, IntBinaryOperator expression) {
this.operation = operation;
this.expression = expression;
}
public int calculator(int number1, int number2) {
return getExpression().applyAsInt(number1, number2);
}
public static OperationEnum from(String operation) {
return Arrays.stream(values())
.filter(value -> operation.equals(value.operation))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("잘못된 값 입력"));
}
public IntBinaryOperator getExpression() {
return expression;
}
}
JavaScript
복사
완료된 소스코드 링크 :
출처