ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Enums
    Programming🧑‍💻/Java 2022. 10. 8. 22:52

    Enums

    보통의 변수는 어떠한 연산이나 논리 관계 속에서 역할은 정해져 있지만 가질 수 있는 값은 입력에 따라 정해지기 때문에 특정할 수 없다.

    예를 들어 피타고라스 정리($a^2+b^2 = c^2$) a, b, c는 밑변, 높이, 빗변으로 표현되지만 가질 수 있는 값은 한정할 수 없다. 

    하지만 월요일 부터 일요일까지 존재하는 요일은 요일이라는 변수에 값의 범위가 정해져 있다.

    이처럼 가질 수 있는 값의 범위가 한정된 경우에는 변수가 가질 수 있는 값을 상수의 집합으로 묶음으로써 코드를 명료하게 할 수 있다. 

     

    * 어떠한 변수 이름을 갖는 객체가 가질 수 있는 값(인스턴스들)이 한정되어 있는 경우 인스턴스들을 그룹화 하여 객체가 지시할 수 있는 인스턴스들을 제한한다. 

     

    Enums 정의하기

    public enum State {
        
        // State 객체가 가질 수 있는 인스턴스들(인스턴스의 속성 값)
        PLAY("Game not finished"),
        DRAW("Draw"),
        WIN_X("X wins"),
        WIN_O("O wins");
    
        // State enum 들의 속성
        private final String msg;
    
        // enum 속성을 부여할 constructor
        State(String msg) {
            this.msg = msg;
        }
    
        // enum 객체의 속성을 가져오는 getMethod
        public String getMsg() {
            return msg;
        }
    
    }

     

     

    Enums 이용하기

    public enum UserStatus {
        PENDING, ACTIVE, BLOCKED
    }

     

    위와 같이 enum을 정의하였을 때 이를 이용해 객체를 만들면 아래와 같이 나타난다. 

    UserStatus active = UserStatus.ACTIVE;

     

    만들어진 객체는 name( ) method를 이용하여 값을 얻을 수 있다.

    System.out.println(active.name()); // ACTIVE

     

    또한 valueOf( ) method를 이용해서도 객체를 만들 수 있다.

    UserStatus blocked = UserStatus.valueOf("BLOCKED"); // BLOCKED

     

    enum의 모든 값을 배열에 넣을 때는 values( ) method를 이용한다.

    UserStatus[] statuses = UserStatus.values(); // [PENDING, ACTIVE, BLOCKED]

     

    ordinal( ) method를 이용하면 enums 안에서 값의 순서를 알 수 있다.

    System.out.println(active.ordinal()); // 1 (starting with 0)
    System.out.println(UserStatus.BLOCKED.ordinal()); // 2

     

    enum이 참조형이긴 하지만 equals와 == 를 모두 사용하여 값을 비교할 수 있다. 

    System.out.println(active.equals(UserStatus.ACTIVE)); // true
    System.out.println(active == UserStatus.ACTIVE); // true

     

    switch에서 사용하기

    UserStatus status = ... // some status
     
    switch (status) {
        case PENDING:
            System.out.println("You need to wait a little.");
            break;
        case ACTIVE:
            System.out.println("No problems, you may pass here.");
            break;
        case BLOCKED:
            System.out.println("Stop! You can't pass here.");
            break;
        default:
            System.out.println("Unsupported enum constant.");
    }

     

     

    반복문에서 사용하기

      for (UserStatus status : UserStatus.values()) {
            System.out.println(status);
        }

    배열 값들을 모두 순회하는 것과 같이 values method를 이용하여 위처럼 반복문에서 활용이 가능하다. 

     


    댓글

Designed by Tistory.