- 이 포스팅은 개인 공부 목적으로 작성한 포스팅입니다.
- 아래 출처 글을 바탕으로 작성하였습니다.
목차
- Enum 기본
- Enum 상수값 정의방법
- Enum 대표 메소드
- Enum String 테스트
- name() 메소드
- valueOf() 메소드
1. Enum 기본
- 열거형은 서로 연관된 상수들의 집합입니다.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUEST, SEPTEMBER,
OCTOBER, NOVEMBER, DECEMBER;
}
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }
- 이렇게 정의된 열거체를 사용하는 방법은 아래와 같습니다.
//예시
Rainbow.RED
2. Enum 상수값 정의방법
- 별도의 추가정의가 없는 열거체의 첫 번째 상수값은 0부터 설정되며, 그 다음은 바로 앞의 상숫값보다 1만큼 증가되며 설정됩니다.
- 그러므로 불규칙한 값(임의의 값)으로 상숫값을 설정하고 싶으면 상수의 이름 옆에 괄호를 추가하고, 그 안에 원하는 상수값을 명시할 수 있습니다.
- 하지만 이때는 반드시 불규칙한 특정 값을 저장할 수 있는 인스턴스 변수와 생성자를 아래 예제와 같이 별도로 추가해야 합니다.
enum Rainbow {
RED(3), ORANGE(10), YELLOW(21), GREEN(5), BLUE(1), INDIGO(-1), VIOLET(-11);
//불규칙한 특정 값을 저장할 수 있는 인스턴스 변수
private final int value;
//별도의 생성자
Rainbow(int value) { this.value = value; }
//getter
public int getValue() { return value; }
}
3. Enum 대표 메소드
public class Main {
enum Rainbow {
RED(3),ORANGE(10), YELLOW(21),GREEN(5),BLUE(1),INDIGO(-1),VIOLET(-11);
private final int value;
Rainbow(int value) {
this.value = value;
}
}
public static void main(String[] args) {
Rainbow rainbow = Rainbow.BLUE;
System.out.println(rainbow.name()); //result: BLUE
Rainbow indigo = Rainbow.valueOf("INDIGO");
System.out.println(indigo.name()); //result: INDIGO
}
}
4. Enum String 테스트
- Enum Value를 String으로 정의할 때 Enum 타입과 String 타입을 구분하는 테스트 코드입니다.
public class Main {
public enum Level {
GOLD("Gold"), SILVER("Silver");
private String value;
Level(String value) {
this.value = value;
}
public String getValue() { return value; }
}
public static void main(String[] args) throws Exception {
System.out.println(Level.GOLD); //GOLD
System.out.println(Level.SILVER); //SILVER
System.out.println(Level.GOLD.getValue()); //Gold
System.out.println(Level.SILVER.getValue()); //Silver
if (Level.GOLD instanceof Level) {
System.out.println("FSSLevel.GOLD instanceof FSSLevel"); //here
}
if (Level.GOLD.getValue() instanceof String) {
System.out.println("FSSLevel.GOLD.getValue() instanceof String"); //here
}
if (Level.GOLD.equals("GOLD")) {
System.out.println("FSSLevel.GOLD.equals(\"GOLD\") is true");
} else {
System.out.println("FSSLevel.GOLD.equals(\"GOLD\") is false"); //here
}
if (Level.GOLD.getValue().equals("Gold")) {
System.out.println("FSSLevel.GOLD.getValue().equals(\"Gold\") is true"); //here
} else {
System.out.println("FSSLevel.GOLD.getValue().equals(\"Gold\") is true");
}
}
}
5. name() 메소드
- name() 메소드를 사용하면 열거형 상수(Enum)의 이름을 String 문자열로 반환할 수 있습니다.
@Getter
public enum NoticeType {
MAJOR("핵심 고객"), ALL("고객");
private final String type;
NoticeType(String type) {
this.type = type;
}
public static NoticeType of(String noticeType) {
try {
return NoticeType.valueOf(noticeType);
} catch (IllegalArgumentException e) {
// throw new Exception...
}
}
}
NoticeType.ALL.name(); // String "ALL"을 반환
NoticeType.MAJOR.name(); // String "MAJOR"를 반환
6. valueOf() 메소드
- static 메소드인 valueOf()는 String 인자를 기준으로 enum 인스턴스를 가져옵니다.
public class Main {
enum Rainbow {
RED("레드"),
ORANGE("오렌지"),
YELLOW("옐로우"),
GREEN("그린"),
BLUE("블루"),
INDIGO("남색"),
VIOLET("보라");
private final String value;
Rainbow(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
public static void main(String[] args) {
try {
// Rainbow value = Rainbow.valueOf("Red"); //print Exception
// Rainbow value = Rainbow.valueOf("red"); //print Exception
// Rainbow value = Rainbow.valueOf("RED"); //print RED
System.out.println(value.name());
} catch (IllegalArgumentException e) {
System.out.println("Exception");
}
}
}
//System.out.println result
GOLD
SILVER
Gold
Silver
FSSLevel.GOLD instanceof FSSLevel
FSSLevel.GOLD.getValue() instanceof String
FSSLevel.GOLD.equals("GOLD") is false
FSSLevel.GOLD.getValue().equals("Gold") is true
출처
- Enum 클래스
- Java:enum의 뿌리를 찾아서...
- Java에서 열거 형을 문자열로