[JAVA] Enum

오잉·2022년 12월 4일
0

JAVA

목록 보기
1/4

Enum

열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입

가장 단순한 형태

public enum Day {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

단순하게 요일을 열거한 Enum
BUT, 각각의 요소들이 특정한 값을 갖게 하고 싶다면? (ex. 각 요일의 풀네임)

요소에 특정 값을 매핑하고 싶다면

  • 필드값을 추가한다
  • 이때 생성자도 추가해야 한다
public enum Day {
    MON("Monday"),
    TUE("Tuesday"),
    WED("Wednesday"),
    THU("Thursday"),
    FRI("Friday"),
    SAT("Saturday"),
    SUN("Sunday")
    ;

    private final String label;

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

    public String getLabel() {
        return label;
    }
}
  • 사용 예시
System.out.println(Day.MON.name());      // MON
System.out.println(Day.MON.label());     // Monday

메소드

name() : enum의 상수를 String 문자열로 반환

values() : 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환

예시1

enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }

public class Enum01 {
    public static void main(String[] args) {
        Rainbow[] arr = Rainbow.values();
        for (Rainbow rb : arr) {
            System.out.println(rb); // RED ORANGE YELLOW ...
        }
    }
}

예시2

public enum Type {
    WALKING("워킹화"), 
    RUNNING("러닝화"),
    TRACKING("트래킹화"), 
    HIKING("등산화");

    final private String shoe;

    private Type(Stirng shoe) { 
        this.shoe = shoe;
    }
    public String getShoe() { 
        return shoe;
    }
}
public class Shoes {
    public static void main(String[] args) {
        for(Type type : Type.values()){
            System.out.println(type.getShoe()); // 워킹화 러닝화 트래킹화 ...
        }
    }
}

valueOf() : 전달된 문자열과 일치하는 해당 열거체의 상수를 반환

enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }

public class Enum02 {
    public static void main(String[] args) {
        Rainbow rb = Rainbow.valueOf("GREEN");
        System.out.println(rb); // GREEN
    }
}

Enum은 자체적으로 name()값으로 Enum값을 찾는 valudOf() 메소드 제공


필드값으로 Enum 찾기

1) 직접 Enum values() 순회하며 찾기

public enum Day {
	MON("Monday"),
    TUE("Tuesday"),
    WED("Wednesday"),
    THU("Thursday"),
    FRI("Friday"),
    SAT("Saturday"),
    SUN("Sunday")
    ;

    private final String label;

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

    public static Day valueOfLabel(String label) {
        return Arrays.stream(values())
                    .filter(value -> value.label.equals(label))
                    .findAny()
                    .orElse(null);
    }
}

2) 캐싱해서 순회 피하기

public enum Day {
	MON("Monday"),
    TUE("Tuesday"),
    WED("Wednesday"),
    THU("Thursday"),
    FRI("Friday"),
    SAT("Saturday"),
    SUN("Sunday")
    ;

    private final String label;

    Day(String label) {
        this.label = label;
    }
    
    private static final Map<String, Day> BY_LABEL =
            Stream.of(values()).collect(Collectors.toMap(Day::label, e -> e));

    public static Day valueOfLabel(String label) {
        return BY_LABEL.get(label);
    }

여러 개의 필드

public enum Day {
    MON("Monday", 10),
    TUE("Tuesday", 20),
    WED("Wednesday", 30),
    THU("Thursday", 40),
    FRI("Friday", 50),
    SAT("Saturday", 60),
    SUN("Sunday", 70)
    ;

    private final String label;
    private final int number;

    Day(String label, int number) {
        this.label = label;
        this.number = number;
    }

    public String label() {
        return label;
    }

    public int number() {
        return number;
    }

    private static final Map<String, Day> BY_LABEL =
            Stream.of(values()).collect(Collectors.toMap(Day::label, Function.identity()));

    private static final Map<Integer, Day> BY_NUMBER =
            Stream.of(values()).collect(Collectors.toMap(Day::number, Function.identity()));

    public static Day valueOfLabel(String label) {
        return BY_LABEL.get(label);
    }

    public static Day valueOfNumber(int number) {
        return BY_NUMBER.get(number);
    }
}

name()과 toString()

  • 공통점 : Enum의 값을 string으로 표현
  • 차이점 : 메소드의 재정의 가능 여부
    • name() : final 메소드 -> 재정의 불가
    • toString() : 재정의 가능
public enum WeekDay {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;

    public String toString() {
        return name().charAt(0) + name().substring(1).toLowerCase();
    }
}

WeekDay.MONDAY.name() // "MONDAY"
WeekDay.MONDAY.toString() // "Monday"

enum to String

  private enum ColdDrink {
        PEPSI("Pepsi"), COKE("Coca Cola"), SPRITE("Sprite");
        private String brandname;
        private ColdDrink(String brand) {
            this.brandname = brand;
        }
       
        @Override
        public String toString(){
            return brandname;
        }
    }
   
   
    public static void main(String args[]) {
        //Converting Enum to String by using name() method
        //by default print mehtod calls toString() of enum
        ColdDrink[] drinks = ColdDrink.values();
        for (ColdDrink drink : drinks) {
            System.out.printf("String to Enum example using name :  %s%n", drink.name());
        }

        //Converting Enum to String using toString() method
        for (ColdDrink drink : drinks) {
            System.out.println("String to enum conversion using toString() : " + drink);
        }
    }
}

Output:
String to Enum example using name: PEPSI
String to Enum example using name: COKE
String to Enum example using name: SPRITE
String to enum conversion using toString() : Pepsi
String to enum conversion using toString() : Coca Cola
String to enum conversion using toString() : Sprite


참고

http://www.tcpschool.com/java/java_api_enum
https://bcp0109.tistory.com/334
https://itmining.tistory.com/149
https://velog.io/@nhj2927/Java-Enum.name-vs-Enum.toString
https://www.java67.com/2012/08/how-to-convert-enum-to-string-in-java.html

profile
오잉이라네 오잉이라네 오잉이라네 ~

0개의 댓글