값의 목록을 정의할 수 있다. 상태를 관리할 때 유용하다.
String으로 상태를 관리하면 오타나 Case-sensetive 문제가 발생할 수 있다.
enum은 문자열로 의미를 이해할 수 있으면서, 목록에 있는 값만을 허용할 수 있다.
public enum OrderStatus {
READY, MAKING, DONE
}
java의 enum은 클래스이다. 각 enum 상수는 필드를 가질 수 있으며, 생성자를 통해 값을 초기화 할 수 있다. 또한 메서드를 가질 수 있다.
public enum Season {
// 상수를 정의하면서 생성자에 값 전달
SPRING("봄", 1),
SUMMER("여름", 2),
FALL("가을", 3),
WINTER("겨울", 4);
// 필드 선언
private final String koreanName;
private final int value;
// Enum 생성자 (private 생략 가능)
Season(String koreanName, int value) {
this.koreanName = koreanName;
this.value = value;
}
// Getter 메서드
public String getKoreanName() {
return koreanName;
}
public int getValue() {
return value;
}
}
public class Main {
public static void main(String[] args) {
Season season = Season.SPRING;
System.out.println(season.getKoreanName()); // 출력: 봄
System.out.println(season.getValue()); // 출력: 1
}
}
List orders = new ArrayList();
orders.add("아메리카노");
orders.add(100);
orders.add(true);
String first = (String) orders.get(0);
String second = (String) orders.get(1); // type mismatch
이 배열은 아무 타입이든 추가할 수 있게 되므로, 값을 꺼낼 때 최상위 타입인 Object로 돌려준다. 명시적으로 형변환을 해준다고 해도 타입 에러가 발생할 위험이 있다.
클래스나 메서드가 사용할 타입을 외부에서 지정해줄 수 있다.
List<String>으로 선언한다면, 애초에 String만 들어갈 수 있게 되니 위와 같은 문제가 발생하지 않는다. 동시에, 하나의 코드를 여러 타입에 대해 재사용할 수 있다.