자바 enum 뜯어보기
포스트
취소

자바 enum 뜯어보기

우아한테크코스 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&lt;(첫번째 항), (두번째 항), (결과)> 자료형으로 정의된다.

`    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문을 사용할 때보다 훨씬 깔끔하고 객체 지향적인 코드를 짤 수 있다.

This post is licensed under CC BY 4.0 by the author.

우아한테크코스 Step 1 시작.

자바 레이싱 게임 - TDD

Comments powered by Disqus.