ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Enum이란?
    Language/Java 2020. 3. 15. 15:41

     

     

    Enum class란?

     

    Enum class는 '서로 연관된 상수들의 집합'으로 기존에 사용하던 상수 정의 방법인 final static string을 사용할 때 발생할 수 있는 여러 문제점을 보완하기 위한 클래스 타입입니다.

     

    Enum을 사용하는 것의 장점은 다음과 같습니다.

     

    1. 코드의 가독성이 좋다.

    2. 개발자가 의도하지 않은 값이 할당되는 것을 방지한다. (컴파일 단계에서 체크 가능)

     

     

    간략한 예시 코드를 가져와 봤습니다.

     

    public class State {
    
    public static final int START = 0;
    public static final int STOP = 1;
    public static final int WAIT = 2;
    
    private final int _stateCode;
    
    public State(int stateCode) {
    	_stateCode = stateCode;
    }
    
    public int get_stateCode() {
    	return _stateCode;
    }
    
    }

    state는 위의 코드와 같이 start, stop, wait 세 개의 상태를 가지며, 각각의 상태 값들은 int 타입의 상수로 정의되어 있습니다.

    public class Main {
    
    	public static void main(String[] args) {
    		
    		State stateStart = new State(State.START); // state에 START값 할당
    		State stateStop = new State(State.STOP);  // state에 STOP값 할당
    		State stateWait = new State(State.WAIT);  // state에 WAIT값 할당
    		State stateExcep = new State(3);    // state범위에 해당하지 않는 int값 할당
    		
    		System.out.println("stateStart: "+stateStart.get_stateCode());
    		System.out.println("stateStop: "+stateStop.get_stateCode());
    		System.out.println("stateWait: "+stateWait.get_stateCode());
    		System.out.println("stateExcep: "+stateExcep.get_stateCode());
    	}
    
    
    // 결과
    // stateStart: 0
    // stateStop: 1
    // stateWait: 2
    // stateExcep: 3
    
    }

    그리고 다음과 같이 각각의 상태값을 가지는 객체를 생성하고, 개발자가 의도한 상태 값에서 벗어나는 int타입의 임의의 값으로 객체를 생성했습니다.

     

    하지만 이러한 문제는 컴파일 과정에서 잡아낼 수 없습니다. int 타입의 변수에 int 타입의 데이터가 할당되었으니 이상할 것이 없기 때문이죠.

    이는 결국 프로그래머가 의도하지 않은 동작을 문제없이 수행하면서 프로젝트 상의 큰 문제를 야기합니다.

     

    enum class를 사용한 코드로 수정해보겠습니다.

     

    public enum StateEnum {
    
    	START(0), STOP(1), WAIT(2);
    	
    	final private int state;
    	
    	public int getState() {
    		return state;
    	}
     
    	private StateEnum(int state){
    		this.state = state;
    	}
    }
    public class Main {
    
    	public static void main(String[] args) {
    		
    		StateEnum stateStart2 = StateEnum.START;
    		StateEnum stateStop2 = StateEnum.STOP;
    		StateEnum stateWait2 = StateEnum.WAIT;
    		StateEnum stateExcep2 = 3;  // 타입 에러 발생
    		
    		System.out.println("stateStart2: "+stateStart2.getState());
    		System.out.println("stateStop2: "+stateStop2.getState());
    		System.out.println("stateWait2: "+stateWait2.getState());
    		
    	}
    }
    
    // 결과
    // stateStart2: 0
    // stateStop2: 1
    // stateWait2: 2

     

    Enum class를 사용해 START, STOP, WAIT 상태 값을 정의하고 각 상태값에 int 타입 데이터를 할당합니다.

    그리고 다음과 같이 state값을 할당합니다.

    출력된 결과값을 확인해보면 int 타입 데이터가 들어간 것을 알 수 있습니다. 하지만 값을 할당할 때는 Enum에 정의된 값이 아닌 int 타입 데이터를 할당할 수 없습니다.

     

    이렇게 Enum을 활용하여 타입 안정성을 보장할 수 있습니다.

     

     

    'Language > Java' 카테고리의 다른 글

    [JAVA] 정렬 메소드 sort() / Comparable / Comparator  (0) 2020.07.04
    [Java] Java의 컬렉션 프레임워크  (0) 2020.04.19
    [JAVA] Reflection  (0) 2020.02.01
    [JAVA] Generic Type  (0) 2020.02.01
    [JAVA] Reader/Writer  (0) 2019.12.07
Designed by Tistory.