JAVA/JAVA

Enum, EnumSet, EnumMap

호두밥 2023. 7. 11. 00:30

Enum

enum은 열거형 상수를 의미합니다. 

public enum Status {
    START("0001"),
    RUNNING("0005"),
    FINISH("9000")
    ; 
    
    private String code;

    Status(String code) {
        this.code = code;
    }
}

Enum을 사용했을 때 좋은 점.

1. 단순 String(원시) 비교가 아니고 Enum 타입으로 비교하기 때문에, 코드의 안전성을 높일 수 있습니다. 

2. 허용가능한 값을 제한할 수 있습니다. 

3. Enum 클래스 안에 상수를 선언하는 것이기 때문에, PREFIX를 줄일 수 있습니다. (ex. STATUS_START = "0001", STATUS_FINISH = "0005")

4. Enum 클래스 안에 메소드를 선언하여, 상수값으로 검증해야 하는 로직을 캡슐화할 수 있습니다.

값을 Enum으로 바꾸기, valueOf

Status status = Status.valueOf("0001");

Enum 안에 메소드 만들기

public enum Status {
    START("0001"),
    RUNNING("0005"),
    FINISH("9000")
    ;
    private String code;

    Status(String code) {
        this.code = code;
    }
    
    public boolean isRunning() {
        return this == RUNNING;
    }
}

@Override를 이용해서 상수마다 다른 처리를 하도록 구현할 수 있습니다. 

public enum Status {
    START("0001"){
        @Override
        public boolean isRunning() {
            return false;
        }
    },
    RUNNING("0005") {
        @Override
        public boolean isRunning() {
            return true;
        }
    },
    FINISH("9000") {
        @Override
        public boolean isRunning() {
            return false;
        }
    }
    ;
    private String code;

    Status(String code) {
        this.code = code;
    }

    public boolean isRunning() {
        return this.equals(RUNNING);
    }
}

EnumSet

EnumSet은 Enum의 요소를 Set으로 만든 것인데, 이 때 요소는 enum 에 선언된 순서대로 저장됩니다.

EnumSet은 산술 비트 연산을 사용하기 때문에, 계산이 매우 빠릅니다.

  EnumSet<Status> statuses = EnumSet.allOf(Status.class); // Enum 요소 모두 포함
  EnumSet<Status> range = EnumSet.range(Status.RUNNING, Status.FINISH); // range에 들어간 것만
  EnumSet<Status> complementOf = EnumSet.complementOf(EnumSet.of(Status.RUNNING, Status.FINISH)); // 특정 요소 제외하고 나머지

EnumMap

EnumMap 은 Enum만 키로 사용하는 Map을 말합니다. 이때 요소의 선언 순서인 ordinal을 이용해 Array로 데이터를 저장합니다.  또한 부수적인 자료형 또한 필요하지 않으므로 메모리를 효율적으로 사용할 수 있습니다. 

Enum 요소를 Key로 사용해야 된다면 EnumMap을 고려해보는게 좋습니다.

 EnumMap<Status, String> activityMap = new EnumMap(Status.class);
 activityMap.put(Status.START, "start-test");
 activityMap.put(Status.RUNNING, "running-test");
 activityMap.put(Status.FINISH, "finish-test");
 
 activityMap.forEach((key,value) -> log.info("key={}, value={}", key, value));
00:29:08.908 [Test worker] INFO subway.service.StatusTest - key=START, value=start-test
00:29:08.910 [Test worker] INFO subway.service.StatusTest - key=RUNNING, value=running-test
00:29:08.910 [Test worker] INFO subway.service.StatusTest - key=FINISH, value=finish-test

출처

 

'JAVA > JAVA' 카테고리의 다른 글

정적 팩토리 메소드와 빌더 패턴  (0) 2023.06.24
I/O  (0) 2022.02.06
인터페이스  (0) 2021.11.30
Optional  (0) 2021.11.07
스트림 Stream  (0) 2021.11.07