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
출처
- https://www.baeldung.com/a-guide-to-java-enums
- https://www.baeldung.com/java-enumset
- https://www.baeldung.com/java-enum-map
'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 |