Dev/Java
열거형(enums) - 열거형을 통해 사용할 수 있는 방법들
린네의
2024. 3. 25. 18:55
열거형은 열거형이 갖는 값뿐만 아니라 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다. 일반적으로 타입이 달라도 값이 같으면 조건식 결과가 true였으나, 자바의 열거형에서는 실제 값이 달라도 타입이 다르면 조건식의 결과가 false 가 된다.
// 열거형을 쓰기전
class Card {
static final int CLOVER = 0;
static final int HEART 1;
static final int DIAMOND =2;
static final int SPADE = 3;
static final int TWO = 0;
static final int THREE = 1;
static final int FOUR = 2;
final int kind;
final int num;
}
// 열거형 사용 후
class Card {
enum Kind { ClOVER, HEART, DIMOND, SPACE}
enum Value { TWO, THREE, FOUR }
final Kind kind;
final Value value;
}
열거형은 어떻게 사용해야할까?
열거형의 사용 방법은 다음과 같다.
enum 열거형 이름 { 상수명1, 상수명 2, 상수명 3...}
열거형에 정의된 상수를 사용하는 방법은 열거형이름.상수명 이다. 클래스의 static 변수를 참조하는 것과 동일하다.
열거형의 비교
- == 사용 가능
- '>', '<'와 같은 비교연산자 사용 불가
- compareTo() 사용 가능 ( 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환 )
java.lang.Enum
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 Class 객체를 반환한다 |
String name() | 열거형 상수의 이름을 문자열로 반환한다. |
int ordinal | 열거형 상수가 정의된 순서를 반환한다. ( 0 부터 시작 ) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name 과 일치하는 열거형 상수를 반환한다. |
enum Direction { EAST, SOUTH, WEST, NORTH }
Direction d = Direction.valueOf("WEST");
System.out.println(d); // WEST
System.out.println(Direction.WEST == Direction.valueOf("WEST")); // true
여기서 ordinal() 이 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수로 사용하지 않는 것이 좋다.
열거형에 멤버 추가하기
- 열거형의 생성자는 제어자가 묵시적으로 private이다
enum Direction {
Direction(int value) {...} // private Direction(int value) 와 동일하다
}
- 열거형 상수를 모두 정의한 다음 멤버들을 추가해야 한다.
- 열거형 상수에 여러값을 지정할 수 있다.
enum Direction {
EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^");
private final int value;
private final String symbol;
Direction(int value, Strng symbol) { // 접근 제어자 private 가 생략 됨
this.value = value;
this.symbol = symbol;
}
public int getValue() { return value; }
public String getSymbol() { return symbol;}
}
열거형 사용 방안
- 같은 타입인데 내부 데이터가 달라야 할 경우 / 그룹화
- code 관리용 테이블 대체
아래는 같은 항목에 묶인 데이터를 enum 형태로 가져온 예제이다.
public enum sameType {
@JsonProperty("data1")
TYPE1("data1"),
@JsonProperty("data2")
TYPE2("data2"),
@JsonProperty("data3")
TYPE3("data3"),
@JsonProperty("data4")
TYPE4("data4"),
@JsonProperty("data5")
TYPE5("data5");
private final String data;
SameType(String data) {
this.data = data;
}
public String getData() {
return data;
}
public String getName(SameType type) {
return type.name();
}
}
code 관리용 테이블을 대체한 예제이다
public enum ApiErrorCode implements ErrorCode{
SUCCESS(HttpStatus.OK, "정상 호출 되었습니다."),
INVALID_REGIST_USER(HttpStatus.BAD_REQUEST, "등록할 수 없는 사용자입니다."),
INVALID_PARAM(HttpStatus.BAD_REQUEST, "파라미터가 유효하지 않습니다."),
INVALID_DATA(HttpStatus.BAD_REQUEST, "데이터형식이 유효하지 않습니다."),
INVALID_INFO(HttpStatus.BAD_REQUEST, "사용자 정보가 유효하지 않습니다."),
DUPLICATED_DATA(HttpStatus.BAD_REQUEST, "이미 등록된 아이디 입니다."),
INVALID_TOKEN(HttpStatus.BAD_REQUEST, "제공된 토큰값이 유효하지 않습니다."),
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "Internal server error.");
private final HttpStatus httpStatus;
private final String message;
}