_열거형_은 변수가 미리 정의된 상수 중 하나의 값을 가지도록 해주는 특별한 자료형이에요.
변수의 값은 그 열거형에 대해 미리 정의된 값 중 하나여야 해요.
흔한 예로는 나침반 방향(NORTH, SOUTH, EAST, WEST 값)과 요일이 있어요.
상수이기 때문에 열거형 필드의 이름은 대문자로 써요.
Java 프로그래밍 언어에서는 enum 키워드를 사용해 열거형을 정의해요.
예를 들어, 요일 열거형은 다음과 같이 정의해요:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
고정된 상수 집합을 표현해야 할 때는 언제든 열거형을 사용하는 게 좋아요. 여기에는 태양계의 행성처럼 자연스럽게 열거형이 되는 것들과, 컴파일 시점에 가능한 모든 값을 알고 있는 데이터 집합(예를 들어 메뉴의 선택지, 명령줄 플래그 등)이 포함돼요.
위에서 정의한 DayOfWeek 열거형을 사용하는 방법을 보여주는 코드예요:
public class Shop {
public String getOpeningHours(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "9am - 5pm";
case SATURDAY:
return "10am - 4pm"
case SUNDAY:
return "Closed.";
}
}
}
var shop = new Shop();
shop.getOpeningHours(DayOfWeek.WEDNESDAY);
// => "9am - 5pm"
Java 프로그래밍 언어의 열거형은 다른 언어의 열거형보다 훨씬 강력해요.
enum 선언은 하나의 _클래스_를 정의해요. 이 클래스를 _열거형_이라고 불러요.
열거형 클래스의 본문에는 메서드나 다른 필드를 포함할 수 있어요:
public enum Rating {
GREAT(5),
GOOD(4),
OK(3),
BAD(2),
TERRIBLE(1);
private final int numberOfStars;
Rating(int numberOfStars) {
this.numberOfStars = numberOfStars;
}
public int getNumberOfStars() {
return this.numberOfStars;
}
}
Rating 열거형의 멤버에서 getNumberOfStars 메서드를 호출하면:
Rating.GOOD.getNumberOfStars();
// => 4
이 연습 문제에서는 로그 라인을 처리해요.
각 로그 라인은 다음과 같은 형식의 문자열이에요: "[<LVL>]: <MESSAGE>".
로그 레벨은 다음과 같아요:
TRC (추적)DBG (디버그)INF (정보)WRN (경고)ERR (오류)FTL (치명적)세 가지 작업을 해봐요.
위 로그 레벨에 대응하는 여섯 개의 원소를 가진 LogLevel enum을 정의해요.
TRACEDEBUGINFOWARNINGERRORFATAL다음으로, 로그 라인을 파싱한 로그 레벨을 반환하는 LogLine.getLogLevel() 메서드를 구현해요:
var logLine = new LogLine("[INF]: File deleted");
logLine.getLogLevel();
// => LogLevel.INFO
안타깝게도, 때때로 알 수 없는 로그 레벨을 가진 로그 라인이 있어요.
이런 로그 라인을 매끄럽게 처리하려면, LogLevel enum에 UNKNOWN 원소를 추가해요. 이 원소는 알 수 없는 로그 레벨을 파싱할 때 반환돼요:
var logLine = new LogLine("[XYZ]: Overly specific, out of context message");
logLine.getLogLevel();
// => LogLevel.UNKNOWN
로그 라인의 로그 레벨은 꽤 장황해요.
로그 라인을 저장하는 데 필요한 디스크 공간을 줄이기 위해 짧은 형식이 개발됐어요: "[<ENCODED_LEVEL>]:<MESSAGE>".
인코딩된 로그 레벨은 로그 레벨을 숫자로 단순하게 매핑한 것이에요:
UNKNOWN - 0
TRACE - 1
DEBUG - 2
INFO - 4
WARNING - 5
ERROR - 6
FATAL - 42
축약된 로그 라인 형식을 출력할 수 있는 LogLine.getOutputForShortLog() 메서드를 구현해요:
var logLine = new LogLine("[ERR]: Stack Overflow");
logLine.getOutputForShortLog();
// => "6:Stack Overflow"
Exercism에 가입하고 Java 트랙을 개념 26개연습 문제 158개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.