뭐라도 끄적이는 BLOG

Java Enum 본문

Java/Java 기본

Java Enum

Drawhale 2023. 7. 2. 06:02

enum 정의하는 방법

Enum은 Enumeration의 약자로 열거형 이라고 부른다.

public enum Week {
    MON,TUE,WEN,THU,FRI,SAT,SUN
}

class나 interface도 상수를 이용하여 같은 용도로 사용할 수 있지만 그런 용도로 사용하라고 만들어진 것이 아니기때문에 Enum을 사용하는 것이 더 좋습니다.

public class Enumeration {
    public static void main(String[] args) {
        Week week = Week.FRI;
        switch (week) {
            case MON:
            case TUE:
            case WEN:
            case THU:
            case FRI:
            case SAT:
            case SUN:
            default:
                break;
        }
    }
}

Enum은 switch문에서 유용하게 사용할 수 있다.

public enum Week {
    MON("월"),
    TUE("화"),
    WEN("수"),
    THU("목"),
    FRI("금"),
    SAT("토"),
    SUN("일");

    Week(String day) {
    }
}

enum에 정의한 상수는 옆에 소괄호를 사용하면 값을 지정할 수 있다. 이때 생성자와 값을 불러올 수 있는 get함수를 생성 해야 한다.

public enum Week {
    MON("월", "business day"),
    TUE("화", "business day"),
    WEN("수", "business day"),
    THU("목", "business day"),
    FRI("금", "business day"),
    SAT("토", "weekend"),
    SUN("일", "weekend");

    Week(String day) {
    }
    Week(String day, String business_day) {
    }
}

원한다면 더 많은 값을 사용할 수 있다.

enum은 클래스 타입이긴 하지만 new 키워드로 객체를 생성할 수 없다.

enum이 제공하는 메소드 (values()와 valueOf())

enum에는 몇가지 기본적으로 제공되는 메소드가 있다. 그중 values는 enum의 모든 값들을 배열로 반환 한다. valueOf는 enum안에 존재하는 상수를 가져올 때 사용한다. 상수와 완벽히 일치하는 문자열을 만날경우 해당 상수를 반환하고 그렇지 않을 경우 IllegalArgumentException을 발생시킨다.

그외 enum에서 제공되는 메소드

  • ordinal(): enum의 순서
  • name(): 각 요소들의 이름(toString에 기본적으로 작성되어 있다)

java.lang.Enum

기본적을 enum 클래스는 java.lang.Enum클래스를 상속 받는다. 그래서 다중상속을 지원하지 않는 java는 별도의 상속을 받을 수 없다. Enum도 Object를 상속 받긴했지만 Object메소드를 재정의 한 것들 중final로 지정한것이 있어 모두 사용할 수 없다.

EnumSet

EnumSet 클래스는 java.util 패키지에 정의 되어 있는 클래스이다. Set인터페이스를 구현하고 있어 Set자료구조의 특징을 가지고 있다.

public class Enumeration {
    public static void main(String[] args) {
        EnumSet<Week> allDays = EnumSet.allOf(Week.class);
        System.out.println(allDays);

        EnumSet<Week> weekend = EnumSet.of(Week.SUN, Week.SAT);
        System.out.println(weekend);

        System.out.println(EnumSet.complementOf(weekend));

        System.out.println(EnumSet.range(Week.WEN, Week.SAT));
    }
}

output

[MON, TUE, WEN, THU, FRI, SAT, SUN]
[SAT, SUN]
[MON, TUE, WEN, THU, FRI]
[WEN, THU, FRI, SAT]

클래스의 모든 메소드가 static키워드를 사용하여 정의되어 있기 때문에 객체 생성없이 사용할 수 있다. Effective java에서 비트 필드를 사용하는 대신 EnumSet을 사용하라고 권장 합니다. (Item36)

EnumMap

EnumMap 클래스는 Map인터페이스를 구현하고 있다. 다른 Map인터페이스를 구현한 HashMap또는 TreeMap등과 비교 했을때 상수를 사용하기 때문에 해싱을 하지 않고, enum을 정의할 때 이미 순서가 정해져 있어 성능상 이점이 많다.

public class Enumeration {
    public static void main(String[] args) {
        EnumMap<Week, String> enumMap = new EnumMap<Week, String>(Week.class);

        enumMap.put(Week.MON, "정기 회의");
        enumMap.put(Week.FRI, "정시 퇴근");
        for(Map.Entry<Week, String> entry : enumMap.entrySet()){
            if (entry.getValue() != null)
                System.out.println(entry.getKey() + "->" + entry.getValue());
        }
    }
}

output

MON->정기 회의
FRI->정시 퇴근
반응형

'Java > Java 기본' 카테고리의 다른 글

Java I/O  (0) 2023.07.02
Java Annotation  (0) 2023.07.02
Java Thread  (0) 2023.07.02
Java Exception, Error  (0) 2023.07.02
Java Interface  (0) 2023.07.02