본문 바로가기

개발/Java

[Java] Enum 에 대해

실무를 진행하다보면 요구사항에 따라 수많은 분기처리가 되는 경우가 있다.

가장 심플하게 해결하자면 if 문으로 도배하면 되는데 (나야 나)

현실적으로 그렇게 처리하면, 구현하면서도 스스로 헷갈리고, 코드를 보는 사람의 입장에서도 굉장히 고달픈 일이 된다.

물론 적절한 분기처리를 수행하지 못해 예상과는 다른 결과가 도출되는 것은 덤.

 

실무에서는 이렇게 분기처리가 많을 경우 Enum을 사용하면 깔끔하게 정리하고 가독성도 높일 수 있다.

최근에도 사용하게 된 케이스가 있었는데 사실 사용하면서도,

실제로 Enum이 얼마나 더 많은 활용도를 가지고 있는지는 깊게 고민해보지 못했다.

 

실제 다른 기술 블로그들을 참고해보면 Enum의 기능에 대해 이야기하고 있는데, 살펴보자면


1. 데이터들 간의 연관관계를 표현해준다.

  • 값은 다르지만 같은 의미를 가진 데이터들을 하나로 묶어서 관리할 수 있다.

2. 상태와 행위를 한 곳에서 관리할 수 있다.

  • 데이터를 얻는 부분과 가공하는 부분이 분리되어 있다면, 같은 데이터를 다루는 다른 기능을 개발하는 과정에서 불필요하게 중복 계산 코드를 작성할 수 있는데, Enum을 활용하면 그럴 가능성이 줄어든다.
  • 아래와 같이 특정 값을 받아 해당 값을 익명암수(람다)로 처리하여 맞는 Enum의 상태를 return해 줄 수 있다.
public enum MyStatus {
    FAST(status -> status < 60,"빠름"),
    MEDIUM(status -> status >= 60 && status < 120,"보통"),
    SLOW(status -> status >= 120,"느림");

    private String statusMessage;
    private DoublePredicate predicate;

    MyStatus(DoublePredicate predicate, String statusMessage) {
        this.predicate = predicate;
        this.statusMessage = statusMessage;
    }

    public static MyStatus of(Double status) {
        return Arrays.stream(MyStatus.values())
                .filter(myStatus -> myStatus.predicate.test(status))
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException("상태가 없습니다."));
    }
}

3. 데이터 그룹관리

  • 이 부분이 내가 Enum을 활용하게 된 부분인데, 코드상으로 수많은 분기들을 하나의 그룹으로 가져올 수 있다.
  • 좀 이상한 구조이긴 하지만, 아무튼 필요한 값을 통해 원하는 로직을 수행하도록 할 수 있다. if문 또는 switch문의 추가 없이 Enum에 값을 추가해주는 것만으로도 기존 구조에서 데이터의 확장이 가능하다.
public enum Languages {
    JAVA(() -> System.out.println("java")),
    C(() -> System.out.println("c")),
    CPP(() -> System.out.println("c++")),
    PYTHON(() -> System.out.println("python")),
    JS(() -> System.out.println("js")),
    GO(() -> System.out.println("go")),
    RUST(() -> System.out.println("rust"));

    private final Runnable runnable;

    Languages(Runnable runnable) {
        this.runnable = runnable;
    }

    public void printName(){
        this.runnable.run();
    }
}

4. 관리의 주체를 DB가 아닌 객체로 한다.

  • DB를 설계하다보면, 데이터들의 상태나 타입을 관리해야 하는 경우가 아주 빈번하게 발생한다. 이럴 때마다 타입을 관리하는 테이블을 둔다고 생각하면, 너무 비효율적이다.
  • 대게, 이러한 상태들은 한번 정하면 잘 바뀌는 일이 없는 대신, 조회는 굉장히 빈번하게 발생하는 데이터들이다. 그렇다면 매번 조회할 때마다, DB에서 값을 가져오는 대신 Enum으로 관리하게 된다면, 객체를 통해 적은 비용으로 빠르게 데이터를 설정할 수 있을 것이다.
  • 아래와 같이 간단하게, 사용자의 역할을 Enum을 통해 부여할 수 있을 것이다.
@Getter
@AllArgsConstructor
public enum Role {
    ADMIN("ADMIN"),
    USER("USER");

    private final String name;
}

아래와 같이 valueOf() 메서드로 특정 값을 가져올 수도 있고, values()로 전체를 배열로 가져올 수도 있다.

Role role = Role.valueOf("ADMIN");

 

이렇게 Enum은 무궁무진(?)한 활용법이 존재한다. 조금 더 실무에서 많은 활용을 통해 구현이 가능하면,

한층 더 클린코드에 다가갈 수 있지 않을까 생각한다.


참고1 : https://techblog.woowahan.com/2527/

 

Java Enum 활용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E

techblog.woowahan.com

참고2 : https://velog.io/@skyepodium/enum-%ED%95%98%EB%82%98%EA%B0%80-if-%EB%AC%B8-%EC%97%AC%EB%9F%AC%EA%B0%9C-%EB%B3%B4%EB%8B%A4-%EB%82%AB%EB%8B%A4

 

[자바] enum 하나가 if 문 여러개 보다 낫다.

enum 하나가 if 문 여러개 보다 낫다.

velog.io