자바) 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 라이센스를 따릅니다.