Post

[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());

---

처리 오류
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.