포스트

Java Enum의 추상 메서드와 람다(Lambda) 활용

Java Enum의 추상 메서드와 람다(Lambda) 활용

Java의 enum은 단순히 상수를 나열하는 도구를 넘어, 각 상수가 고유한 로직을 실행할 수 있는 ‘행위’를 가질 수 있다. 이전에는 추상 메서드를 통해 이를 구현했다면, 더 나아가 함수형 인터페이스와 람다(Lambda)를 결합하여 코드를 훨씬 간결하게 만드는 방법을 학습했다.

1. Enum 내 추상 메서드와 상수별 클래스 본문

enum 내부에 추상 메서드를 선언하면, 모든 상수는 이 메서드를 반드시 구현해야 한다. 이를 상수별 클래스 본문(Constant-specific class body)이라고 하며, 마치 익명 클래스를 선언하듯 각 상수 옆에 로직을 붙일 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
public enum Operator {
    PLUS {
        @Override
        public int apply(int a, int b) { return a + b; }
    },
    MINUS {
        @Override
        public int apply(int a, int b) { return a - b; }
    };

    public abstract int apply(int a, int b);
}

2. 람다(Lambda)를 활용한 Enum 로직 개선

추상 메서드를 일일이 @Override 하는 방식은 코드가 길어지고 가독성이 떨어질 수 있다. 이때 함수형 인터페이스(Functional Interface)enum의 필드로 선언하고 생성자에서 람다식을 주입받으면 코드가 매우 간결해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.function.BinaryOperator;

public enum Operator {
    PLUS("+", (a, b) -> a + b),
    MINUS("-", (a, b) -> a - b),
    MULTIPLY("*", (a, b) -> a * b),
    DIVIDE("/", (a, b) -> a / b);

    private final String symbol;
    private final BinaryOperator<Integer> expression;

    Operator(String symbol, BinaryOperator<Integer> expression) {
        this.symbol = symbol;
        this.expression = expression;
    }

    public int apply(int a, int b) {
        return expression.apply(a, b);
    }
}

3. 학습 내용 요약 및 비교

구분추상 메서드 방식람다(함수형 인터페이스) 방식
코드 가독성상수마다 @Override가 붙어 길어짐람다 한 줄로 표현되어 간결함
확장성복잡한 로직이 필요할 때 유리함짧고 명확한 로직에 최적화됨
핵심 원리상수별 클래스 본문 활용함수형 인터페이스를 필드로 주입
  • 익명 함수의 조화: enum 생성자에 람다식을 전달함으로써, 상수가 인스턴스화될 때 각기 다른 전략(Strategy)을 가질 수 있게 된다.
  • 유연한 설계: 단순히 연산뿐만 아니라 조건 검사, 문자열 변환 등 다양한 함수형 인터페이스(Predicate, Function 등)를 적용할 수 있음을 배웠다.

기존의 딱딱한 상수 나열에서 벗어나, 람다를 통해 enum을 하나의 강력한 클래스처럼 사용할 수 있다는 점이 Java 언어의 유연함을 다시금 느끼게 해주었다.


🔗 참고 자료 (Sources)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.