포스트

자바) enum, 열거형

자바) enum, 열거형

이 글은 Tistory에서 이전된 포스팅입니다. 원본은 여기에서 확인할 수 있습니다.

enum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class Test {
    enum Direction {
        EAST("East", 10),
        WEST("West", -10),
        SOUTH("South", -20),
        NORTH("North", 20);

        private final String label;
        private final int val;

        Direction(String label, int val) {
            this.label = label;
            this.val = val;
        }

        public String label() {
            return label;
        }

        public int val() {
            return val;
        }

        private static final Map<String, Direction> BY_LABEL =
                Stream.of(values()).collect(Collectors.toMap(Direction::label, Function.identity()));

        private static final Map<Integer, Direction> BY_NUMBER =
                Stream.of(values()).collect(Collectors.toMap(Direction::val, Function.identity()));

        public static Direction valueOfLabel(String label) {
            return BY_LABEL.get(label);
        }

        public static Direction valueOfNumber(int val) {
            return BY_NUMBER.get(val);
        }
    }

    public static void main(String[] args) {
        System.out.println(Direction.valueOfLabel("West").val());
    }
}

enum의 생성자는 private이므로 사용할 수 없고 자동 생성된다.

values()는 컴파일러가 열거형에 자동적으로 추가해주는 메서드 이다.
static E[] values()

열거형 조상인 java.lang.Enum 클래스에 정의된 것 중 ordinal()이 있다.
열거형 상수가 정의된 순서(0부터)를 정수로 반환한다.

ordinal()이 정의된 순서를 반환하지만, 이 값은 내부적인 용도로만 사용되기 위한 것으로 열거형 상수의 값으로 사용하지 않는 것이 좋다고 한다. 그래서 인스턴스 변수와 생성자를 추가하고 get메서드를 만들어 사용한다.

추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public enum Test {
    USER(Authority.USER),
    ADMIN(Authority.ADMIN);

    private final String authority;

    Test(String authority) {
        this.authority = authority;
    }

    public String getAuthority() {
        return this.authority;
    }

    public static class Authority {
        public static final String USERCODE = "ROLE_12%755642%1021654%8789";
        public static final String ADMIN = "ROLE_ADMIN";
    }
}

위의 코드처럼 static class를 정의해서 상수를 넣을 수 있다. 무슨 이점이 있을까?

만약 User 상수가 User("ROLE_12%755642%1021654%8789") 라면 해당 상수의 의미를 전달하기 어려울 수 있다. 그런 부분에서 Authority.USERCODE라면 해당 상수가 유저 코드를 뜻하는 것을 전달할 수 있다.

이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.