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;

}