자바 열거형

계리·2023년 5월 22일
0

열거형이란?

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

자바에서 열거형은 타입에 안전한 열거형이라서 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다.

만약 상수의 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일해야 하는데 열거형을 사용하면 기존의 소스를 다시 컴파일하지 않아도 된다.

ch12_5
enum Direction { EAST, SOUTH, WEST, NORTH }
public class EnumEx1 {
    public static void main(String[] args) {
        Direction d1 = Direction.EAST;
        Direction d2 = Direction.valueOf("WEST");
        Direction d3 = Direction.valueOf(Direction.class, "EAST");

        System.out.println("d1 = " + d1);
        System.out.println("d2 = " + d2);
        System.out.println("d3 = " + d3);

        System.out.println("d1 == d2 ? " + (d1==d2));
        System.out.println("d1 == d3 ? " + (d1==d3));
        System.out.println("d1.equals(d3) ? " + d1.equals(d3));
//        System.out.println("d2 > d3 ? " + (d1 > d3));     //  에러
        System.out.println("d1.compareTo(d3) ? " + d1.compareTo(d3));
        System.out.println("d1.compareTo(d2) ? " + d1.compareTo(d2));

        switch (d1) {
            case EAST: //  Direction.EAST라고 쓸 수 없다.
                System.out.println("The direction is EAST."); break;
            case SOUTH:
                System.out.println("The direction is SOUTH."); break;
            case NORTH:
                System.out.println("The direction is NORTH."); break;
            case WEST:
                System.out.println("The direction is WEST."); break;
            default:
                System.out.println("Invalid direction."); break;
        }

        Direction[] dArr = Direction.values();

        for(Direction d : dArr)     //  for(Direction d : Direction.values())
            System.out.printf("%s=%d%n", d.name(), d.ordinal());
    }
}

결과 값
d1 = EAST
d2 = WEST
d3 = EAST
d1 == d2 ? false
d1 == d3 ? true
d1.equals(d3) ? true
d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2
The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3

열거형에 멤버 추가하기

ch12_6
enum Direction {
    EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^");

    private static final 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 static Direction of(int dir) {
        if (dir < 1 || dir > 4){
            throw new IllegalArgumentException("Invalid value : " + dir);
        }
        return DIR_ARR[dir - 1];
    }

    //  방향을 호전시키는 메서드, num의 값만큼 90도씩 시계방향으로 회전한다.
    public Direction rotate(int num) {
        num = num % 4;

        if(num < 0) num += 4;   //  num이 음수일 때는 시계반대 방향으로 회전

        return DIR_ARR[(value - 1 + num) % 4];
    }

    public String toString(){
        return name() + getSymbol();
    }
}   //  enum Direction

public class EnumEx2 {
    public static void main(String[] args) {
        for(Direction d : Direction.values())
            System.out.printf("%s = %d%n", d.name(), d.getValue());

        Direction d1 = Direction.EAST;
        Direction d2 = Direction.of(1);

        System.out.printf("d1 = %s, %d %n", d1.name(), d1.getValue());
        System.out.printf("d2 = %s, %d %n", d2.name(), d2.getValue());
        System.out.println(Direction.EAST.rotate(1));
        System.out.println(Direction.EAST.rotate(2));
        System.out.println(Direction.EAST.rotate(-1));
        System.out.println(Direction.EAST.rotate(-2));
    }
}

※ 참고 문헌
남궁성, 『Java의 정석 3nd Edition』, 도우출판(2016) 책으로 공부하고 정리한 내용 입니다.

profile
gyery

0개의 댓글