컴퓨터/질문: 개발

[2017.08.21] 12. 왜 Enum을 사용할까?

heepie 2017. 8. 21. 22:03

Enum은 Enumerated Type으로 '서로 연관된 상수 값들의 집합'이다.

(cf. 배열은 서로 연관된 변수 값들의 집합 / 왜 배열을 사용할까? - http://heepie.tistory.com/2)


Enum의 등장 배경

 

1. 복잡한 값 -> 단순한 값으로

상수는 변하지 않는다는 특징을 이용해 복잡한 값->단순한 값으로 치환해 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
    /*
     * 1 = banana
     * 2 = apple
     * 3 = lemon
     */
    int type = 1;
    switch(type) {
    case 1:
        System.out.println("banana");
        break;
    case 2:
        System.out.println("apple");
        break;
    case 3:
        System.out.println("lemon");
        break;
    }
}
cs

문제점은 치환한 값에 대한 정보(주석)가 삭제될 경우 or 복잡한 코드로 주석을 찾기 어려워 질 경우 번호의 의미를 알 수 없다.

해결책으로 주석 삭제 후 변하지 않는 클래스 변수로 설정(final static)해 상수명 사용


 

2. 변하지 않는 클래스 변수로 설정

final static으로 설정해 주석 없이도 의미를 파악 할 수 있게 되었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private final static int BANANA = 1;
private final static int APPLE = 2;
private final static int LEMON = 3;
    
public static void main(String[] args) {
    int type = BANANA;
    switch(type) {
    case 1:
        System.out.println("banana");
        break;
    case 2:
        System.out.println("apple");
        break;
    case 3:
        System.out.println("lemon");
        break;
    }
}
cs

문제점은 같은 상수명을 갖는 다른 의미의 값이 존재 가능하고 그 경우 에러 발생할 수 있다.

1
2
3
4
5
6
7
private final static int BANANA = 1;
private final static int APPLE = 2;        // 과일 사과 
private final static int LEMON = 3;
    
private final static int GOOGLE = 1;
private final static int APPLE = 2;        // 회사 애플 
private final static int MS = 3;
cs

해결책 중 하나로 Interface를 통한 상수명 구체화해 상수명의 중복을 피할 수 있다.


 

3. Interface로 상수명 구체화 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface FRUIT {
    final static int BANANA = 1;
    final static int APPLE = 2;        // 과일 사과 
    final static int LEMON = 3;
}
 
interface COMPANY {
    final static int GOOGLE = 1;
    final static int APPLE = 2;        // 회사 애플 
    final static int MS = 3;
}
            .
            .
    int type = FRUIT.BANANA;
            .
            .
cs

문제점은 의미로 비교할 수 없는 상수 간의 비교가 가능하다. (비교를 하더라도 컴파일 에러가 발생하지 않는다.)

1
2
3
if (FRUIT.APPLE == COMPANY.APPLE) {
    System.out.println("과일 애플과 회사 애플은 같다.");
}
cs

해결책 중 인스턴스 생성으로 데이터 타입을 구별해 비교 시 컴파일 에러 발생하도록 프로그래밍한다.

 

4. 인스턴스 생성

1
2
3
4
5
6
7
8
9
10
11
class Fruit {
    public final static Fruit APPLE = new Fruit();
    public final static Fruit BANANA = new Fruit();
    public final static Fruit LEMON = new Fruit();
}
 
class Company {
    public final static Company GOOGLE = new Company();
    public final static Company BANANA = new Company();
    public final static Company MS = new Company();
}
cs

문제점은 이렇게 노력해서 문제점을 해결해 놓았더니! switch문의 조건문에는 사용자 정의 클래스를 사용 할 수 없다...

(출처 - https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html)

해결책으로 모든 조건 만족시켜며 switch문에서 사용 가능한 Enum 등장!

 


5. 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
enum FRUIT{
    BANANA, APPLE, LEMON
}
 
enum COMPANY {
    GOOGLE, APPLE, MS
}
 
public class ex5 {
    public static void main(String[] args) {
        FRUIT type = FRUIT.BANANA;
        switch (type) {
        case BANANA:
            System.out.println("banana");
            break;
        case APPLE:
            System.out.println("apple");
            break;
        case LEMON:
            System.out.println("lemon");
            break;
        }
    }
}
cs

정리


장점

1. 코드의 양이 줄었다.

2. 인스턴스 생성과 상속 시도 시, 컴파일 에러

3. enum이라는 키워드로 열거형의 의도를 명확히 드러냄

 

 

※ enum 사용 시, 알아야 할 점(http://heepie.tistory.com/38)

#enum #왜 enum #enum 사용 이유 #enum 등장 #enum 탄생