본문 바로가기
JAVA BASE/GenericsEnumsAnnotation

05. [자바] 열거형(enums)

by staticClass 2021. 1. 8.

열거형?

열거형은 서로 관련도니 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.

열거형이 갖는 값뿐만 아니라 타입도 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다.

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
<
^

 

댓글