Enum
JDK 1.5 이전의 자바에서는 열거체(enumeration type)를 사용할 수 없었다.
하지만, JDK 1.5부터는 C언어의 열거체보다 더욱 향상된 성능으로 사용할 수 있어졌다.
Enum은 "연관된 상수들의 집합"이라고 표현되기도 하며 서로 관련된 상수를 편리하게 선언할 수 있다.
보통, 대문자 형태로 정의하며 중복되지 않아야 한다.
대체 왜 Enum을 사용할까?를 고민한다면 이유는 다음과 같다.
- 동등 연산자로 비교할 때 기존의 final static으로 선언한 상수와 달리 타입을 체크하여 비교해주기 때문에 타입 안전하다.
- 기존의 final static으로 선언한 상수는 변경 후 컴파일해야했지만 Enum의 경우 변경되더라도 재컴파일할 필요가 없다.
자 그러면 어떻게 Enum을 어떻게 사용하는지에 대해서 살펴보자.
Enum 사용
우리는 기존에 상수를 사용하기 위해 다음과 같이 작성했다.
class Week {
public static final String MONDAY = "월요일";
public static final String TUESDAY = "화요일";
public static final String WEDNESDAY = "수요일";
public static final String THURSDAY = "목요일";
public static final String FRIDAY = "금요일";
public static final String SATURDAY = "토요일";
public static final String SUNDAY = "일요일";
}
public class enumTest {
public static void main(String[] args) {
String today = "월요일";
switch(today) {
case Week.MONDAY:
System.out.println("월요일입니다.");
break;
case Week.TUESDAY:
System.out.println("화요일입니다.");
break;
case Week.WEDNESDAY:
System.out.println("수요일입니다.");
break;
...
}
}
}
- 만약 MONDAY를 누군가 "월요"로 실수로 변경한다면 컴파일 타임에 오류를 잡을 수 없다.
enum Week {
MONDAY("월요일"),
TUESDAY("화요일"),
WEDNESDAY("수요일"),
THURSDAY("목요일"),
FRIDAY("금요일"),
SATURDAY("토요일"),
SUNDAY("일요일");
private String value;
Week(String value) {
this.value = value;
}
}
public class enumTest {
public static void main(String[] args) {
Week today = Week.MONDAY;
switch(today) {
case MONDAY:
System.out.println("월요일입니다.");
break;
case TUESDAY:
System.out.println("화요일입니다.");
break;
case WEDNESDAY:
System.out.println("수요일입니다.");
break;
}
}
}
- 각각의 엘리먼트에 대한 고유 문자열을 가지기 때문에 의미가 명확하고 사용자의 실수를 방지할 수 있다.
- 외부에 Enum type이 노출되기 때문에 중복이나 오타에 대한 염려를 하지 않아도 된다.
Enum 메서드
메서드를 살펴보면 다음과 같다.
1. Static Methods
(1) valueOf()
enum Week {
MONDAY("월요일"),
TUESDAY("화요일"),
WEDNESDAY("수요일"),
THURSDAY("목요일"),
FRIDAY("금요일"),
SATURDAY("토요일"),
SUNDAY("일요일");
private String value;
Week(String value) {
this.value = value;
}
}
public class enumTest {
public static void main(String[] args) {
Week monday = Week.valueOf("MONDAY");
System.out.println("monday = " + monday);
}
}
- valueOf()는 입력한 파라미터에 해당하는 문자열과 동일한 Enum 객체를 리턴한다.
- 없을시, Exception을 리턴한다.
(2) values()
enum Week {
MONDAY("월요일"),
TUESDAY("화요일"),
WEDNESDAY("수요일"),
THURSDAY("목요일"),
FRIDAY("금요일"),
SATURDAY("토요일"),
SUNDAY("일요일");
private String value;
Week(String value) {
this.value = value;
}
}
public class enumTest {
public static void main(String[] args) {
Week[] values = Week.values();
for (Week value : values) {
System.out.println("value = " + value);
}
}
}
// value = MONDAY
// value = TUESDAY
// value = WEDNESDAY
// value = THURSDAY
// value = FRIDAY
// value = SATURDAY
// value = SUNDAY
- values()는 Enum의 모든 객체를 리턴한다.
(3) ordinal()
enum Week {
MONDAY("월요일"),
TUESDAY("화요일"),
WEDNESDAY("수요일"),
THURSDAY("목요일"),
FRIDAY("금요일"),
SATURDAY("토요일"),
SUNDAY("일요일");
private String value;
Week(String value) {
this.value = value;
}
}
public class enumTest {
public static void main(String[] args) {
Week monday = Week.MONDAY;
System.out.println("monday.ordinal() = " + monday.ordinal());
}
}
// monday.ordinal() = 0
- ordinal()은 Enum 객체 중 몇번째 객체인지를 리턴한다.
- 0부터 시작한다.
(4) name()
enum Week {
MONDAY("월요일"),
TUESDAY("화요일"),
WEDNESDAY("수요일"),
THURSDAY("목요일"),
FRIDAY("금요일"),
SATURDAY("토요일"),
SUNDAY("일요일");
private String value;
Week(String value) {
this.value = value;
}
}
public class enumTest {
public static void main(String[] args) {
Week monday = Week.MONDAY;
System.out.println("monday.name() = " + monday.name());
}
}
// monday.name() = MONDAY
- name()은 Enum 객체가 가진 문자열을 리턴한다.
(5) compareTo()
enum Week {
MONDAY("월요일"),
TUESDAY("화요일"),
WEDNESDAY("수요일"),
THURSDAY("목요일"),
FRIDAY("금요일"),
SATURDAY("토요일"),
SUNDAY("일요일");
private String value;
Week(String value) {
this.value = value;
}
}
public class enumTest {
public static void main(String[] args) {
Week monday = Week.MONDAY;
Week tuesday = Week.TUESDAY;
System.out.println("monday.compareTo(tuesday) = " + monday.compareTo(tuesday));
System.out.println("tuesday.compareTo(monday) = " + tuesday.compareTo(monday));
}
}
// monday.compareTo(tuesday) = -1
// tuesday.compareTo(monday) = 1
- compareTo()는 Enum 객체를 기준으로 ordinal을 기준으로 비교한다.
- 더 앞에 위치한다면 음수, 더 뒤에 위치한다면 양수를 리턴한다.
'자바' 카테고리의 다른 글
JAVA Generic (0) | 2021.10.16 |
---|---|
JAVA Collection (0) | 2021.10.15 |
JAVA Lambda, Functional Interface (0) | 2021.10.14 |
JAVA Exception (0) | 2021.10.13 |
Java Optional (1) | 2021.10.04 |