자바 1.5부터 지원되었다. 열거타입이라고 한다.
1. enum이라는 것이 존재하지 않을때
상수를 아래와 같이 정의하여 사용했다.
private final static int APPLE = 1;
private final static int BANANA = 2;
private final static int ORANGE = 3;
좋은 방법이긴 한데, 문제점이 여럿 있다.
1) 1,2,3 이라는 숫자가 좀 거슬린다. 아무런 패턴도 없고.. 그냥 임의의 값이다..
2) 변수가 추가될 때마다 class의 상단에 위와같이 계속해서 추가해줘야 한다.
3) 변수명이 중복될 경우 애매해진다.
만약 위의 상황에서 기업 이름의 상수를 추가하고자 하면, 아래와 같이 될 수 있다.
private final static int APPLE = 1;
private final static int BANANA = 2;
private final static int ORANGE = 3;
private final static int GOOGLE = 4;
private final static int ORACLE = 5;
private final static int APPLE = 6; // 중복됨! 기업이름도 애플이 있음 ㅜ.ㅜ
1~6까지 의미없는 상수값도 거슬리고, 변수명이 중복되는 상황도 발생했다.
대안법으로는
private final static int Fruit_APPLE = 1;
private final static int Fruit_ BANANA = 2;
private final static int Fruit_ ORANGE = 3;
private final static int Company_GOOGLE = 4;
private final static int Company_ORACLE = 5;
private final static int Company_APPLE = 6;
이 있는데.. 지저분하다.
2. enum의 등장
public enum Fruit{
APPLE, BANANA, ORANGE;
}
아래의 class와 동일한 의미를 가진다.
class Fruit{
public static final Fruit APPLE = new Fruit();
public static final Fruit BANANA = new Fruit();
public static final Fruit ORANGE= new Fruit();
private Fruit(){}
}
APPLE, BANANA, ORANGE가 각각 하나의 Fruit 인스턴스인 것이다.
위의 상수들처럼 쓸모없는 값을 임의로 세팅할 필요도 없다.
Fruit.APPLE, Fruit.BANANA 등의 형태로 사용한다.
- 생성자를 가질 수도 있고, 내부에 메서드를 가질수도 있다.
public enum Fruit{
APPLE("red"), BANANA("yellow"), ORANGE("orange");
private String color;
public String getColor(){
return this.color;
}
Fruit(String color){
this.color = color;
}
}
APPLE("red"), BANANA("yellow")는 값 세팅이 아니다. 생성자를 호출하는 것이다.
생성자의 접근제어자는 default 이하로만 가질 수 있으며, 외부에서 호출 불가능하다.
Fruit.APPLE; 이라고 하면 red 라는 값을 받아서 Fruit enum의 생성자가 실행되는 것이다.
Fruit.APPLE.getColor(); //와 같이 사용 가능하다.
- enum에서 기본적으로 제공하는 메서드들도 사용 가능하다.
static Enum[] values : enum 변수들을 리스트로 반환
static Enum valueOf(String name) : name에 해당하는 enum을 찾음. 유연하게 사용 가능해진다.
int ordinal : 해당 enum 이 몇번쨰로 저장되어있는지 리턴한다. 0부터 시작
EnumType.values(); // [L (배열)
EnumType.valueOf("APPLE").getColor(); // red
'JAVA,JSP' 카테고리의 다른 글
리플렉션(2), Class 생성, Method 실행 (0) | 2016.08.07 |
---|---|
리플렉션(1), Class 클래스 (5) | 2016.07.29 |
예외처리(2) (0) | 2016.07.03 |
예외처리(1) (0) | 2016.06.30 |
java.lang.NoSuchMethodError (1) | 2016.06.28 |