우아한테크코스 1주차 때 과제로 ‘문자열 계산기 만들고 JUnit으로 단위 테스트하기’를 받았다.
워밍업 식의 간단한 미션이지만 더 깔끔하게 짜고 싶은 욕심에 이리저리 시도해 보았다.
그 중에 하나는, 기존에 당연히 if~else문이나 switch문으로 구현해야 하는 줄 알았던 연산자(+, -, *, /)를 구분하여 계산하는 방법을 조건문 없이 구현해 보는 것이었다.
enum은 열거형이라고도 하는데, 관련이 있는 상수 여러 개를 나열하여 한 묶음으로 하여 사용하도록 하는 것이다.
`public enum Operator { PLUS("+", (leftOperand, rightOperand) -> leftOperand + rightOperand), MINUS("-", (leftOperand, rightOperand) -> leftOperand - rightOperand), MULTIPLY("*", (leftOperand, rightOperand) -> leftOperand * rightOperand), DIVIDE("/", (leftOperand, rightOperand) -> leftOperand / rightOperand); private final String operator; private final BiFunction<Double, Double, Double> expression; Operator(String operator, BiFunction<Double, Double, Double> expression) { this.operator = operator; this.expression = expression; }`
enum 클래스는 class 대신 enum으로 선언하며, 단 한 번만 생성하고 중복 생성되지 않는다.
이름(name()
)인 PLUS
에 대하여 operator
에 해당하는 “+”와 expression
에 해당하는 람다 계산식이 묶여있으며,
계산식은 BiFunction<(첫번째 항), (두번째 항), (결과)>
자료형으로 정의된다.
` public static Operator of(String operator) { return Arrays.stream(values()) .filter(op -> op.operator.equals(operator)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 연산자입니다.")); } public double calculate(double leftOperand, double rightOperand) { return expression.apply(leftOperand, rightOperand); } }`
연산자를 구분하는 메소드 of
를 통해 연산자에 알맞는 식을 불러온 다음, calculate
를 호출하면 최종적으로 계산이 된다.
실제 식을 사용할 때는 이렇게 사용한다.
`Operator.of("*").calculate(4, 5) // 20`
이렇게 하면 switch문을 사용할 때보다 훨씬 깔끔하고 객체 지향적인 코드를 짤 수 있다.
Comments powered by Disqus.