티스토리 뷰

IT/Java

Java - enum

Normal_One 2017. 3. 5. 16:44

 이번에 설명할 내용은 enum입니다. enum은 enumeration의 약자로 enumeration은 열거라는 뜻을 가지고 있습니다. 열거라는 뜻을 가지고 있는 enum은 배열과 비슷하게 생각할 수 있으나 배열과는 속성을 달리하는 녀석입니다. 배열이 데이터들의 집합체라면 enum은 class의 일종입니다. 따라서, 단순히 데이터를 저장하는 것 외에도 메소드나 변수를 선언하는 것을 enum 내부에서 할 수 있습니다. 일단 먼저 가장 단순한 형태의 enum부터 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
package blog;
 
public class enumTest {   
    public static void main(String[] args) {      
        System.out.println(animal.lion);    
    }        
 
    enum animal {     
        lion, tiger, monkey    
    }
}
cs


 위의 enum은 가장 단순한 형태의 enum입니다. class를 선언하듯이 enum을 선언하고 그 안에 문자열을 기입하면 끝입니다. enum은 여타 클래스들과 달리 인스턴스를 가질 수 없으며 그 자체로만 사용 가능합니다. 또한 enum에 저장 된 내용은 final 속성이 붙기 때문에 임의로 바꿀수가 없습니다. 그럼 좀 더 복잡한 형태의 enum을 보겠습니다. 


enum에서 getter, setter 선언

 enum에서 임의로 getter, setter를 만들어서 private 속성을 줄 수 있습니다. 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package blog;
 
public class enumTest {    
    public static void main(String[] args) {         
        liking.pie.setValue(3.15);        
        System.out.println(liking.pie.getValue());    
    }            
 
    private enum liking {        
        pie(3.14);                 
        double value;        
        liking(double num) {            
            this.value = num;        
        }        
        double getValue() {            
            return value;        
        }        
        double setValue(double num) {            
        return this.value = num;        
        } //getter, setter를 임의로 부여    
    } //private enum(get, set)
}   
cs


 위 코딩은 임의로 getter, setter를 만든 enum입니다. enum 열거형 자료를 hashmap과 같이 선언하여 keyvalue와 data 형태를 이루도록 선언해 주었고 getter와 setter를 설정해주어 임의로 private 속성을 부여했습니다.



enum에서 overriding과 overloading

 enum은 클래스이기 때문에 내부에 메소드와 변수 선언이 가능하고 이에 따라 overriding과 overloading도 가능합니다. 


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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package blog;
 
public class enumTest {    
    public static void main(String[] args) {         
        int a = 3;        
        int b = 4;        
        operation.plus.returnValue(a, b);        
        operation.minus.returnValue(a, b);        
        operation.multiple.returnValue(a, b);        
        operation.divide.returnValue(a, b);        
        operation.plus10.returnValue(a);        
        operation.multiple.returnValue(a, liking.pie.getValue());    
    }            
 
    private enum liking {        
        pie(3.14);                 
        double value;        
        liking(double num) {            
            this.value = num;        
        }        
        double getValue() {            
            return value;       
        }        
        double setValue(double num) {            
            return this.value = num;        
        }    
    } //private enum(get, set)            
 
    public enum operation {        
        plus {            
            public void returnValue(double a,double b) {                
                System.out.println(a+b);            
            } //Overriding        
        },        
        minus {            
            public void returnValue(double a,double b) {                
                System.out.println(a-b);            
            } //Overriding        
        },        
        multiple {            
            public void returnValue(double a,double b) {                
                System.out.println(a*b);            
            } //Overriding        
        },        
        divide {            
            public void returnValue(double a,double b) {                
                System.out.println(a/b);            
            } //Overriding        
        },        
        plus10 {            
            int ten = 10//변수 작성 가능            
            public void returnValue(double a) {                
                System.out.println(ten + a);            
            } //Overriding        
        };        
        public void returnValue(double a, double b){};        
        public void returnValue(double a){}; //오버로딩    
    } //enum에서 오버라이딩, 오버로딩의 예
cs


 위 내용은 operation이라는 enum에 사칙연산을 만들어놓은 모양입니다. 각각의 사칙연산에 메소드를 선언해주었습니다. 이 메소드들은 가장 밑에 작성되어있는 returnValue 메소드를 각각 상속받은 형태로 오버라이딩 임을 알 수 있습니다. 만약에 가장 밑에 작성되어있는 returnValue가 없다면 오류가 떠서 컴파일이 되지 않습니다. 그리고 변수 작성이 가능하다는 것을 보여드리려고 plus10을 선언하여 변수 작성이 가능하다는 것을 보였습니다. 이 자료형은 double 자료형의 인자를 하나만 받도록 되어 있으므로 오버로딩을 이용하였습니다. 
 이렇게 enum에서 할 수 있는 다양한 코딩을 해보았습니다. 저도 본격적으로 enum에 대해서 알아보기 전에는 단순히 배열의 일종인줄 알았으나, class의 역할을 하며 메소드와 변수의 선언이 가능하다는 것을 알 수 있었고 활용할 수 있는 방안이 무궁무진하다는 것을 알 수 있었습니다. 
 사실 현업에서 enum을 쓰는 경우는 뭐 거의 없다고 생각됩니다. 제가 프로젝트를 많이 가지지 않아서 일지도 모르겠지만 enum을 쓰는 경우를 본 적은 한번도 없었습니다. 아니 쓰는 것은 봤어도 뭐 위의 코딩과 같이 메소드를 선언하고 변수를 선언하는 저런 코딩은 한 번도 본적이 없습니다. 따라서 그렇게 자세히 공부를 할 필요는 없다고 생각되긴 하지만 그래도 뭐 공부하면 쓸 일이 오지 않을까 싶습니다. 그러면 다음에는 각 종 배열에 대해 알아보도록 하겠습니다. 
 

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday