ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java: Enum 클래스의 기본적인 이해
    각종 학습 요약/Java 2022. 5. 19. 09:29

    Java: 열거형(enumerated type, enum)의 기본적인 이해


    enum은 대개 상수 역할을 하는 식별자를 말한다. Java에서는 enum을 별도의 클래스 형식으로 다룬다.
    전통적인 static final 상수에 비교해 어떤 점이 좋은지, 작성 방법과 사용 방법, 주의점을 기초적인 내용만 간략하게 다뤄보려고 한다.

    static final을 쓰면 되지 왜 그런걸 써?


    • 문자열이나 숫자를 상수(static final)로 사용하는 것에 비해, 툴 레벨에서 지원받는 기능이 많다(오토컴플릿, 오타 표시 등).
    • 수용할 값을 명확히 제한할 수 있다. (리터럴 비교가 아닌, 객체 비교로 인한 안정성)
    • 컴파일 타임 타입안정성 보장. (변경될 일이 '확실히' 없다.)
    • 코드에 맥락이 생긴다.

    장점은 굳이 이해할 필요는 없다. 외워야 한다면 그건 장점이 아닐테니까.
    하지만 사용법은 외워야 하니까 한 번 알아보자..!

    enum 사용 규칙


    /* 아주 기본적인 형태의 enum class는 이런 모양을 가진다. */
    enum Days {
        MONDAY, 
        TUESDAY, 
        WEDNESDAY, 
        THURSDAY, 
        FRIDAY, 
        SATURDAY, 
        SUNDAY; // 컨벤션에 따라, enum값은 대문자로 작성한다.
    }
    
    public class Test {
        void run() {
            Days day = Days.THURSDAY; // 해당 이넘 타입으로 변수에 담을 수도 있다.
            System.out.println(day); // 당연히 사용도 가능하다 => THURSDAY
        }
    
        void rerun() {
            Days day = Days.THURSDAY;
    
            //switch문의 활용도 용이하다
            switch(day) {
                case MONDAY, TUESDAY:
                    System.out.println("컨디션 굿!");
                    break;
                case WEDNESDAY, THURSDAY:
                    System.out.println("피곤...");
                    break;
                case FRIDAY:
                    System.out.println("버닝!!");
                    break;
                case SATURDAY, SUNDAY:
                    System.out.println("편---안");
                    break;
            }
        }
    
        void lastrun() {
            Days day = Days.THURSDAY;
    
            /* 이넘클래스는 자체적으로 메서드를 가지고 있다. */
            System.out.println(day.name());     // 이넘 타입 이름
            System.out.println(day.ordinal());  // 이넘 클래스의 몇번째 값인지
            System.out.println(day.compareTo(Days.WEDNESDAY));  // 비교대상이 비교주체에 비해 얼마나 앞에 있는지 => 1
            System.out.println(day.compareTo(Days.FRIDAY));     // => -1
            System.out.println(day.values());   // 모든 이넘을 배열로 리턴
        }
    }

    염두할 점


    1. name() 사용 권장.
      • ordinal()은 int 타입이 반환되기 때문에 다른 enum 객체와의 비교 시 의도치 않은 결과를 얻을 수 있다.
      • ordinal()이 필요한 것 같은 상황이 되면, ordinal()대신 필드 사용을 고려하자.
    2. enum 객체도 객체기 때문에, 필드나 생성자(private), 메서드를 추가할 수 있다. 인터페이스 구현도 가능!
      • 여러 값을 하나로 비교해야 할 경우에 고려해보자(예시: 1, 'Y', 'y', "예"라는 값을 모두 TRUE라는 enum값으로 체크해야 할 경우).

    댓글

Designed by Tistory.