ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-34] Enum 기본 (열거 타입)
    Java 2021. 1. 27. 13:17

    Java Enum

    열거타입, Enum 정의 하는법

    데이터를 저장할 때 우리는 가끔 한정된 값으로만 데이터를 저장해야할 때가 많이 있을 거시다. 예를 들어서 4계절 을 따져볼 때, FourSeason(Spring, Summber, Fall, Winter) 이 4가지를 제외하고 다른 계절이 올 수 없을 것이다. 그럼 우리는

        public static void main( String[] args )
        {
            String season = "winter";
        }

    다음과 같이 직접 String타입의 필드를 선언해주고, 리터럴을 입력해줘야 하지만, Enum(열거타입)을 사용하게 되면, 이를 *enum 타입으로 정의할 수 있다. *

    enum 정의 하는 법

    enum.java

    public enum Season {
        SPRING, // 봄
        SUMMER, // 여름
        FALL, // 가을
        WINTER // 겨울
    }

    public enum (열거타입 이름)으로 선언이 올 수 있다. enum 키워드는 반드시 소문자로 만들어야 한다. 그리고 열거 상수를 선엉ㄴ하면 되는데, 관례적으로 열거 상수는 모두 대문자로 작성하도록 한다.

    클래스 내부에서 정의

    public class Vacation {
        LocalDate data = LocalDate.now();
    
        FourSeason fourSeason = FourSeason.SPRING;
    
        enum FourSeason{
            SPRING,
            SUMMER,
            FALL,
            WINTER
        }
    }

    enum 변수 선언

    public class Vacation {
        LocalDate data = LocalDate.now();
        Season season;
        // 열거타입 + 변수 ; 
        public Vacation(Season season){
            this.season = season;
        }
    }

    다음과 같이 enum 타입 열거타입으로 변수를 선언이 가능 하다.

    enum 변수 초기화

        public static void main(String[] args) {
              // 열거타입 변수 = 열거타입.열거상수;
            Vacation summerVacation = new Vacation(Season.SUMMER);
            Vacation winterVacation = new Vacation(Season.WINTER);
              // null 로도 선언 가능
            Vacation nullVacation = new Vacation(null);
        }

    Enum 메소드

    1. name()

        public static void main(String[] args) {
    
            Season nowSeason = Season.SPRING;
            String name = nowSeason; // Error
            String name = nowSeason.name(); // "Spring" 반환 
        }

    enum 의 상수를 String 문자열로 반환한다.

    2. Ordinal()

    enum 상수가 몇번째에 있는지 확인해주는 메소드 이다.

    public enum Season {
        SPRING, // 0
        SUMMER, // 1
        FALL, // 2
        WINTER // 3
    }
        public static void main(String[] args) {
            Season nowSeason = Season.SPRING;
            int num = nowSeason.ordinal();
            System.out.println(num); // 0 출력
        }

    하지만 별로 사용하는 걸 추천하지 않는다. 순서에 따라 출력이 되기 때문에 지금은 Spring 이 0 번 째 이지만, 만약 SPRING 앞에 다른 열거상수 가 들어오게 되면 SPRING 은 유동적으로 1로 변하기 때문이다.

    valueOf()

    valueOf(" str ") 을 통해 enum 에 정의된 " str " 과 똑같은 문자열의 객체를 반환 하게 된다.

       public static void main(String[] args) {
            Season season = Season.valueOf("SPRING");
            if(season == Season.SPRING){
                System.out.println("season == SPRING"); //출력
            }
        }

    values

    values 메소드는 이넘의 모든 객체들을 배열로 만들어 리턴한다.

        public static void main(String[] args) {
    
            Season[] seasons = Season.values();
            for(Season s : seasons){
                System.out.println();
            }
        }

    java.lang.Enum

    이런 메소드들은 어디에 정의되어있는 걸까? 바로 java.lang.enum 에 추상클래스의 형태로 정의되어있다. 모든 클래스는 Object가 조상클래스 이듯이, 모든 이넘 클래스들은 java.lang.enum 이 조상인데, 안타깝지만 모든 메소드들은 final 로 정의 되어있기 때문에 overriding이 불가능 하다.

    package org.example;
    
    public enum Season {
        SPRING, // 0
        SUMMER, // 1
        FALL, // 2
        WINTER // 3
    
        public String name(){ //Error
            //code
        }
    }
    
    Error : 'name()' cannot override 'name()' in 'java.lang.Enum'; overridden method is final

    EnumSet

    EnumSet 이란 enum 타입을 set 자료구조의 형태로 사용할 수 있는 형태를 말한다.

        public static void main( String[] args )
        {
            String season = "winter";
    
            EnumSet<Season> seasonEnumSet = EnumSet.allOf(Season.class);
            // 모든 Season의 열거 원소를 set에 추가
            EnumSet<Season> seasonEnumSet1 = EnumSet.of(Season.SPRING, Season.SUMMER);
            // 선택된 Season 원소를 Set에 추
    
            Iterator<Season> iter =  seasonEnumSet.iterator(); // 이터레이터 형태로도 사용 가능
            while (iter.hasNext()){
                System.out.println(iter.next());
            }
        }

    댓글

Designed by Tistory.