Java - Enum 클래스 사용

1. Enum 클래스 정의

  Java 기본 입문서를 보면 거의 필연적으로 한번쯤은 보았던 Enum 클래스를

실무에서는 어떠한 방식으로 사용하면 좋을지에 대해서 정리하고자한다.

 

Java의 Enum 클래스는 열거형(Enumeration)을 나타내는 특별한 형태의 클래스이다.

 

이러한 Enum클래스는 서로 연관된 상수들을 하나의 그룹으로 정의하고, 해당 그룹에 속한 값들을

일관성있게 다루기에 좋다.

 

보통 Enum 클래스는 기본적으로 아래와 같이 선언할 수 있다.

public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}

 

Enum클래스에서는 위와 같이 선언하고자 하는 상수가 Enum 클래스의 생성자로서의 역할을 한다.

 

위와 같이 선언한 이후 다른 클래스에서 Day.MONDAY 와 같은 형식으로 사용할 수 있으며

이 때 Day.MONDAY의 데이터 타입은 Day 즉 해당 enum 클래스 객체이다.

 

 

따라서 만약에 각 요일을 문자열로 얻고싶다면

public enum Day {
    MONDAY("월요일"),
    TUESDAY("화요일"),
    WEDNESDAY("수요일"),
    THURSDAY("목요일"),
    FRIDAY("금요일"),
    SATURDAY("토요일"),
    SUNDAY("일요일");

    private final String dayOfWeek;

    Day(String dayOfWeek) {
        this.dayOfWeek = dayOfWeek;
    }

    public String getDayOfWeek() {
        return this.dayOfWekk;
    }
}

위와 같이 선언 해준 뒤

Day.getDayOfWeek(MONDAY) 이런식으로 활용할 수 있다.

 

또는 문자열을 한글버전, 영문버전으로 받고싶다면 아래와 같이 작성할 수 있다.

public enum Day {
    MONDAY("월요일" ,"MonDay"),
    TUESDAY("화요일", "TuesDay"),
    WEDNESDAY("수요일", "wednesDay"),
    THURSDAY("목요일", "ThursDay"),
    FRIDAY("금요일", "Friday"),
    SATURDAY("토요일", "SaturDay"),
    SUNDAY("일요일", "SunDay");

    private final String dayOfWeekKOR;
    private final String dayOfWeekENG;

    Day(String dayOfWeekKOR, String dayOfWeekENG) {
	this.dayOfWeekKOR = dayOfWeekKOR;
        this.dayOfWeekENG = dayOfWeekENG;
    }

    public String getDayOfWeekKOR() {
        return this.dayOfWekkKOR;
    }
    public String getDayOfWeekENG() {
        return this.dayOfWekkENG;
    }
}

 

String mondayInKorean = Day.MONDAY.getDayOfWeekKOR();  // 결과: "월요일"
String mondayInEnglish = Day.MONDAY.getDayOfWeekENG();  // 결과: "Monday"

 

이처럼 Enum 클래스도 클래스이므로 생성자, 메소드, 필드를 가지기 때문에

상수를 유연하게 저장할 수 있다.

 

2. 그래서 어따 써먹을건데?

실무에서는 공통코드값들을 코드에 작성할일이 발생할 때,

해당 코드값들을 Enum 클래스로 정의하는 것도 고려해볼만한 방법인 것 같다.

 

예를 들어 아래와 같이 Enum 클래스를 정의하여 사용할 수 있다.

@Getter
public enum FruitCode {
    APPLE("APPLE", "사과", "AE"),
    BANANA("BANANA", "바나나", "AE"),
    CHERRY("CHERRY", "체리", "AE");
   

    private final String code;
    private final String codeNm;
    private final String upCode;

    FruitCode(String code, String codeNm, String upCode) {
        this.code = code;
        this.codeNm = codeNm;
        this.upCode = upCode;
    }
    
    /**
     * @Desc 주어진 코드에 해당하는 FruitCode 열거형을 반환
     * @param code 찾고자 하는 코드
     * @return 해당 코드에 매칭되는 FruitCode 열거형, 또는 null
     */
    public static FruitCode findByCode(String code) {
        for (FruitCode fruitCode : values()) {
            if (fruitCode.getCode().equals(code)) {
                return fruitCode;
            }
        }
        return null;
    }
}

 

위와 같이 선언한 뒤 다른 클래스에서 APPLE이라는 코드의 국문명이 필요하면

FruitCode.APPLE.getCodeNm() 이러한 식으로 가져다가 쓸 수있으며 

 

위에서 언급했다시피 Enum클래스는 메소드를 가질 수 있다고 하였는데

실무에서 여러 코드값에 대해서 코드명을 처리해줘야하는 상황이라면 아래와 같이 처리하여 사용할 수 있다.

ArrayList<String> fruitCodeList = new ArrayLsit<>();

for(String fruitCode : fruitCodeList ){
	String fruitName = Fruitcode.findByCode(fruitcode).getCodeNm();
    System.out.println(fruitName);
}