[Java] Enum 타입
Enum 타입
Enum?
Enum은 “Enumeration”의 약자이다. 즉 어떠한 로직보다는 데이터를 열거한 요소들의 집합이라고 볼 수 있다. 흔히 자바 프로그래밍에서 상수처리를 도맡아 한다.
과거 상수 처리
과거엔 보통 final 제어자를 이용하여 상수화를 많이 했다.
1
2
3
4
5
6
7
class PastFinal{
private final static int ONE = 1;
public static void main(String[] args) {
System.out.println(PastFinal.ONE);
}
}
→ 이런식으로 사용했었다.. 하지만 여러 클래스에서 사용하기 번거롭고 따라서 이러한 상수들을 캡슐화할 수 없을까? 해서 나온 것이 Enum!
Enum
Enum 선언
Enum클래스를 먼저 보고 분석해보자
OutputType.java
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
public enum OutputType {
INSPEC("01","점검 중"),
SUCCESS("02","정상 종료"),
FAIL("03","처리 오류"),
SB("04","반송"),
HW("05","수작업(재할당)"),
UNKNOWN("", "unknown");
;
OutputType(String code, String description) {
this.code = code;
this.descriptions = description;
}
private final String code;
private final String descriptions;
public String getCode() {
return code;
}
public String getDescriptions() {
return descriptions;
}
public static OutputType getByCode(String code){
for(OutputType type : OutputType.values()){
if(type.getCode().equalsIgnoreCase(code)){
return type;
}
}
return OutputType.UNKNOWN;
}
}
→ 먼저 나는 어떤 상태를 정의하고 각각 그 상태의 코드 네임과 설명을 매핑하려고 한다. 예를 들어, 각각의 상수 변수처럼 INSPEC이라는 이름의 enum을 만들고 그 enum의 생성자에 들어갈 요소(코드 네임, 설명)을 미리 정의해준다. 여기선 String 타입으로 둘다 정의 했다
1
2
private final String code;
private final String descriptions;
그러고 난 뒤, Getter도 만들어서 나중에 Inspec이라는 enum객체를 불러왔을 때 Inspec에 매핑된 코드와 설명을 가져올 수 있게 하였다.
1
2
3
4
5
6
7
public String getCode() {
return code;
}
public String getDescriptions() {
return descriptions;
}
그리고 이것을 생성자로 정해준 뒤,
1
2
3
4
OutputType(String code, String description) {
this.code = code;
this.descriptions = description;
}
각각의 enum 객체를 선언했다
1
2
3
4
5
6
7
INSPEC("01","점검 중"),
SUCCESS("02","정상 종료"),
FAIL("03","처리 오류"),
SB("04","반송"),
HW("05","수작업(재할당)"),
UNKNOWN("", "unknown");
;
마지막으로 getByCode() 메서드를 선언하여 어떤 코드(ex. 05)를 입력했을 때 HW 객체를 가져올 수 있게 하였다.
1
2
3
4
5
6
7
8
public static OutputType getByCode(String code){
for(OutputType type : OutputType.values()){
if(type.getCode().equalsIgnoreCase(code)){
return type;
}
}
return OutputType.UNKNOWN;
}
→ 여기서 values()는 기본 메서드로 정의되어있고 그 enum에 있는 객체들 전부 가져오는 것이다. 그리고 하나씩 getCode()로 비교하여 결국 하나의 enum객체를 반환한다.
Enum 사용
쉽다!
만약 어떤 객체의 코드를 출력하고 싶다?
1
2
3
4
5
System.out.println(OutputType.INSPEC.getCode());
---
01
만약 어떤 객체의 설명을 출력하고 싶다?
1
2
3
4
5
System.out.println(OutputType.INSPEC.getDescription());
---
점검 중
만약 03이라는 코드의 객체를 가져오고 싶다?
1
2
3
4
5
6
7
OutputType findType = OutputType.getByCode("03");
System.out.println(findType.getDescription());
---
처리 오류
Comments powered by Disqus.