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

skyepodium·2022년 3월 22일
35

최근 자바 개발을 하면서 enum을 정말 편하고 안전하게 사용했던 경험 이있습니다.

1. 예시

실제랑 전혀 관련 없도록 포켓몬으로 예를 들면

  • 타입: 풀, 번호 1 - 이상해씨
  • 타입: 불, 번호 4 - 파이리
  • 타입: 물, 번호 7 - 꼬부기

타입, 번호 정보를 가지고 포켓몬의 이름을 구분하는 메서드를 작성했습니다.

그런데, 이렇게 하다보니 쓸데없이 if문 중첩만 늘어났습니다.

그리고, 어딘가에서 누군가는 if문 다르게 사용할것 같은 불안감이 들었습니다.

마지막으로, 코드 많이 작성하는거 안좋아해서 정말 정말 줄이고 싶었습니다.

public String getPokemonName (Pokemon pokemon) {
    String name = "";

    if(pokemon.getType().equals("grass") && pokemon.getNumber() == 1) {
        name = "이상해씨";
    }
    else if(pokemon.getType().equals("fire") && pokemon.getNumber() == 4) {
        name = "파이리";
    }
lse if(pokemon.getType().equals("water") && pokemon.getNumber() == 7) {
        name = "꼬부기";
    }

    return name;
}

class Pokemon {
    private String type;
    private int number;
}

2. enum 을 사용하자

비슷한 고민을 하신분들이 있을것이라 생각하고 찾아보았습니다. 우아한 형제들 블로그의 Java Enum 활용기 을 적극 참고했습니다.

    1. enum 클래스에 식별자 작성
    1. 스트림, 람다를 통해 식별자 필터링
    1. 식별자에서 이름 반환
import java.util.Arrays;

enum Pokemon {
    bulbasaur("이상해씨", "grass", 1),
    charmander("파이리", "fire", 4),
    squirtle("꼬부기", "water", 7),
    missingno("미씽노", "normal", 0);


    private String name;
    private String type;
    private int number;

    Pokemon(String name, String type, int number) {
        this.name = name;
        this.type = type;
        this.number = number;
    }

    // 타입, 번호를 기준으로 식별자 필터링
    public static Pokemon getPokemon (String type, int number) {
        return Arrays.stream(Pokemon.values())
                .filter(x -> x.type.equals(type) && x.number == number)
                .findAny()
                .orElse(missingno);
    }

    // 필터링된 식별자의 이름 반환
    public static String getPokemonName (String type, int number) {
        return getPokemon(type, number).getName();
    }

    public String getName() {
        return this.name;
    }
}

class Main {
    public static void main(String[] args) {

        String name = Pokemon.getPokemonName("grass", 1);

        System.out.println("name " + name);
    }
}

3. 장점

개인적으로 느낀 장점은

1) 람다 필터링이 if 문보다 안전하다.
2) 시간 복잡도는 유사하다.
3) enum 자체가 싱글톤이기 때문에 어디에서나 불러서 사용가능하다.
4) lombok을 사용하면 코드가 정말 더 줄어든다.
5) 유지보수 하기 쉽다. 식별자 하나만 더 넣으면 된다.

4. 참고

Java Enum 활용기

profile
callmeskye

2개의 댓글

comment-user-thumbnail
2022년 3월 30일

글 잘봤어요~ ㅎㅎ 요즘 이넘써볼려고 노력중인데 if가 익숙해져서 손이 아직 안익네요~ ㅎㅎ

답글 달기
comment-user-thumbnail
2022년 3월 31일

스트림으로 순회하며 찾는 대신, private static 으로 Map 을 하나 선언해놓고 거기서 꺼내는 방식으로 시간복잡도를 줄일 수 있습니다.

답글 달기