열거형?
열거형은 서로 관련도니 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.
열거형이 갖는 값뿐만 아니라 타입도 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다.
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;
}
위와 같은 코드를 에넘으로 관리하게 되면 아래와 같이 관리가 가능하다
class Card {
enum Kind { CLOVER, HEART, DIAMOND, SPADE } // 열거형 Kind를 정의
enum Value { TWO, THREE, FOUR } // 열거형 Value를 정의
}
몇가지 예제를 통해 enum의 사용법을 알아보자.
상수 이름 출력 - name(), valueOf(), ...
enum RockPaperScissors {가위, 바위, 보}
public enumEx {
public static void main(String[] args) {
RockPaperScissors rPS1 = RockPaperScissors.가위;
RockPaperScissors rPS2 = RockPaperScissors.valueOf("바위");
RockPaperScissors rPS3 = Enum.valueOf(RockPaperScissors.class, "가위");
System.out.println(rPS1.name());
System.out.println(rPS2.name());
System.out.println(RockPaperScissors.valueOf("보"));
System.out.println("rPS1=" + rPS1);
System.out.println("rPS2=" + rPS2);
System.out.println("rPS3=" + rPS3);
}
}
가위
바위
보
rPS1=가위
rPS2=바위
rPS3=가위
name() 메소드는 열거(enum) 객체가 가지고 있는 문자열을 리턴해준다.
이때 리턴되는 문자열은 열거 타입을 정의할때 작성한 상수 이름과 동일하다.
비교 - ( == ), equals()
public enumEx {
public static void main(String[] args) {
RockPaperScissors rPS1 = RockPaperScissors.가위;
RockPaperScissors rPS2 = RockPaperScissors.valueOf("바위");
RockPaperScissors rPS3 = Enum.valueOf(RockPaperScissors.class, "가위");
System.out.println("rPS1==rPS2 ? " + (rPS1==rPS2));
System.out.println("rPS1==rPS3 ? " + (rPS1==rPS3));
System.out.println("rPS1.equals(rPS3) ? " + rPS1.equals(rPS3));
}
}
rPS1==rPS2 ? false
rPS1==rPS3 ? true
rPS1.equals(rPS3) ? true
상수간의 비교에서는 '=='가 사용 가능하며 equals() 역시 사용이 가능하다.
크기비교 - compareTo()
public enumEx {
public static void main(String[] args) {
RockPaperScissors rPS1 = RockPaperScissors.가위;
RockPaperScissors rPS2 = RockPaperScissors.valueOf("바위");
RockPaperScissors rPS3 = Enum.valueOf(RockPaperScissors.class, "가위");
System.out.println("rPS1.compareTo(rPS3) ? " + (rPS1.compareTo(rPS3)));
System.out.println("rPS1.compareTo(rPS2) ? " + (rPS1.compareTo(rPS2)));
}
}
rPS1.compareTo(rPS3) ? 0
rPS1.compareTo(rPS2) ? -1
크기 비교를 하기 위해서 <, >를 사용 할 수 없고 compareTo()를 이용해야한다.
열거형 상수의 순서 반환 - ordinal()
public enumEx {
public static void main(String[] args) {
RockPaperScissors rPS1 = RockPaperScissors.가위;
RockPaperScissors rPS2 = RockPaperScissors.valueOf("바위");
RockPaperScissors rPS3 = Enum.valueOf(RockPaperScissors.class, "가위");
System.out.println(rPS1.ordinal());
System.out.println(rPS2.ordinal());
}
}
0
1
열거형 상수가 정의된 순서를 반환해준다. (0부터 시작)
배열로 변환 - values()
public enumEx {
public static void main(String[] args) {
RockPaperScissors rPS1 = RockPaperScissors.가위;
RockPaperScissors rPS2 = RockPaperScissors.valueOf("바위");
RockPaperScissors rPS3 = Enum.valueOf(RockPaperScissors.class, "가위");
RockPaperScissors[] rPSArr = RockPaperScissors.values();
System.out.println(Arrays.toString(rPSArr));
}
}
[가위, 바위, 보]
배열로 만들 수 있다.
배열로 변환 후 반복문
public enumEx {
public static void main(String[] args) {
RockPaperScissors rPS1 = RockPaperScissors.가위;
RockPaperScissors rPS2 = RockPaperScissors.valueOf("바위");
RockPaperScissors rPS3 = Enum.valueOf(RockPaperScissors.class, "가위");
RockPaperScissors[] rPSArr = RockPaperScissors.values();
for(RockPaperScissors rPS : rPSArr) {
System.out.printf("%s=%d%n", rPS.name(), rPS.ordinal());
}
}
}
가위=0
바위=1
보=2
당연한 이야기 이지만 위와 같이 반복문으로도 사용이 가능하다.
switch에 사용
public enumEx {
public static void main(String[] args) {
RockPaperScissors rPS1 = RockPaperScissors.가위;
RockPaperScissors rPS2 = RockPaperScissors.valueOf("바위");
RockPaperScissors rPS3 = Enum.valueOf(RockPaperScissors.class, "가위");
switch(rPS1) {
case 가위: // RockPaperScissors.가위 라고 쓸 수 없다.
System.out.println("가위를 내셨습니다."); break;
case 바위:
System.out.println("바위를 내셨습니다."); break;
case 보:
System.out.println("보를 내셨습니다."); break;
}
}
}
가위를 내셨습니다.
swtich문의 조건식에도 열거형을 사용할 수 있지만 상수의 이름만 적어야 한다.
열거형에 멤버 추가하기
enum Direction{
EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^"); // 끝에 ';'를 추가해야함
private static Direction[] DIR_ARR = Direction.values();
private final int value; // 정수를 저장할 필드(인스턴스 변수)를 추가
private final String symbol; // 문자열을 저장할 필드(인스턴스 변수)를 추가
// 생성자를 추가
Direction(int value, String symbol) { // 접근 제어자 private이 생략됨
this.value = value;
this.symbol = symbol;
}
public int getValue() {
return value;
}
public String getSymbol() {
return symbol;
}
}
public class Source06_EnumEx2 {
public static void main(String[] args) {
for(Direction d : Direction.values()) {
System.out.printf("%s=%d%n", d.name(), d.getValue());
}
System.out.println(Direction.EAST.getSymbol());
System.out.println(Direction.SOUTH.getSymbol());
System.out.println(Direction.WEST.getSymbol());
System.out.println(Direction.NORTH.getSymbol());
}
}
EAST=1
SOUTH=2
WEST=3
NORTH=4
>
V
<
^
댓글