ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11. Enum
    Java 2021. 1. 29. 17:13

    목표

    자바의 열거형에 대해 학습하세요.

    학습할 것 (필수)

    • enum 정의하는 방법
    • enum이 제공하는 메소드
    • java.lang.Enum
    • EnumSet

    enum 정의하는 방법

    enum Position {
      TOP, JUG, MID, ADC, SUP;
    }

    - enum 키워드 사용

    - enum은 엄연한 클래스이다.

    - 모두 상수이기 때문에 대문자로 표기할 것

    - 0부터 시작되는 정수값이 연속적으로 부여됨

     

    - 생성자의 접근제어자는 private 이기에 외부에서 생성자 상수 추가 불가능

    - 정의된 상수 하나당 실제로 하나의 인스턴스 생성 ( private static final )

    - 열거형의 멤버중 하나가 호출 되면 열거된 모든 상수의 객체가 생성됨

     

    - 열거형 상수의 비교에는 '==' , 'compareTo()' 사용 가능

    - 비교 연산자 사용 불가능

     

    - enum 에서 추상 메서드를 추가한 경우 

    public enum Season {
        SPRING("봄"){
            @Override
            void describeSeaon() {
                System.out.println("봄은 따듯합니다.");
            }
        }, SUMMER("여름"){
            @Override
            void describeSeaon() {
                System.out.println("여름은 뜨겁습니다.");
            }
        }, FALL("가을"){
            @Override
            void describeSeaon() {
                System.out.println("가을은 서늘합니다.");
            }
        }, WINTER("겨울"){
            @Override
            void describeSeaon() {
                System.out.println("겨울은 춥습니다.");
            }
        };
    
        private String description;
        
        Season(String description){
            this.description = description;
        }
        
        public String getDescription(){
            return this.description;
        }
    
        abstract void describeSeaon();
    }
    
    ---------
    Season.SUMMER.describeSeaon(); // 여름은 뜨겁습니다.
    System.out.println(Season.WINTER.getDescription()); // 겨울

     

    - 데이터와 메소드가 있는 enum

    public enum JuSik {
      SAMSUNG(85600, -1.27),
      APPLE(158450, 0.17),
      TESLA(977313, -1.74),
      AMD(104817, -3.48),
      INTEL(61102, -0.91);
    
      private final double closingPrice;
      private final double fluctuationRate;
    
      JuSik(double closingPrice, double fluctuationRate) {
        this.closingPrice = closingPrice;
        this.fluctuationRate = fluctuationRate;
      }
    
      public double getCP() {
        return closingPrice;
      }
      public double getFR() {
        return fluctuationRate;
      }
    }

    enum 이 제공하는 메소드 

    values()

    - enum 에서 정의한 상수들을 배열 형태로 반환해준다.

    Position[] positions = Position.values();
    for (Position p : positions) {
      System.out.println(p);
    }
    
    /*
    TOP
    JUG
    MID
    ADC
    SUP
    */

     

    valueOf(String name)

    - 지정된 enum에서 name과 일치하는 상수를 반환해준다.

    - 전달된 문자열과 동일한 상수가 없을경우 Null Pointer Exception 발생 

    Postion position = Position.valueOf("MID");
    System.out.println(position);
    
    // MID

     

    ordinal()

    - enum 상수가 정의된 순서를 반환해준다.

    ordinal은 Enum 내부에서 사용하기 위해 만든 것이지 프로그래머가 사용하라고 만든 메서드가 아니다. (사용 X)

    Position[] positions = Position.values();
    for(Position p : positions){
      System.out.println(p + " " + v.ordinal());
    }
      
    /*
    TOP 0
    JUG 1
    MID 2
    ADC 3
    SUP 4
    */

     

    name()

    - 이름을 반환해준다.

    - toString() 과 같은 역할을 하지만 차이점은 Override 의 가능 여부이다. 

    - name() 의 경우 final

    Position[] positions = Position.values();
    for(Position p : positions){
      System.out.println(p + " " + p.name());
    }
      
    /*
    TOP 
    JUG 
    MID 
    ADC 
    SUP 
    */

     


    java.lang.Enum

    - 모든 enum 타입은 java.lang.Enum 을 상속받은 클래스이다.

    - java.lang.Enum 은 추상 클래스이며 우리가 사용하는 enum은 java.lang.Enum 을 상속받았기에 다른 클래스를 상속받을 수 없다.

    - 앞의 메서드 들은 모두 여기 정의되어 있다.

    - 대부분의 메서드는 final 로 선언되어 있기에 별도의 오버라이딩을 할 수 없다.


    EnumSet

    - enum 을 위해 특별히 고안된 Set 인터페이스 구현체

    - HashSet 과 비교시 성능 상의 이점이 많기에 enum을 위한 Set 이 필요한 경우 EnumSet 을 사용하는 것이 좋음

    - null 값을 허용하지 않고, Null Pointer Exception을 throw 하는것도 허용하지 않는다.

    - ordinal 값의 순서대로 요소가 저장된다.

    - thread-safe 하지않다. 

    - 모든 메서드는 비트연산자를 사용하기에 기본 연산의 시간 복잡도가 O(1) 이다.

    - 따른 컬렉션들과 달리 new 연산자를 사용할 수 없다.

     

    public class EnumSetTester {
      public static void main(String[] args) {
      
        // allOf(enum type) -> 인자로 받은 열거형의 모든 상수를 받는다.
        EnumSet<Season> seasonEnumSet = EnumSet.allOf(Season.class);
        System.out.println(seasonEnumSet.size());
            
        // copyOf(enumset) -> 인자로 받은 enumset 이 가지고 있는 값들을 모두 받는다.
        EnumSet<Season> copySeasonEnumSet = EnumSet.copyOf(seasonEnumSet);
    
        // of(e, e1) -> 인자로 받은 상수들만 받는다.
        EnumSet<Region> regionEnumSet = EnumSet.of(Region.KOREA, Region.CHINA);
    
        // complementOf(enumset) -> 인자로 받은 enumset 이 포함하지 않는 enum 의 상수들만 받는다.
        EnumSet<Region> complementOfEnumSet = EnumSet.complementOf(regionEnumSet);
        
        // range(e1, e2) -> 인자로 받은 e1 ~ e2 까지의 값들
        EnumSet<Season> rangeEnumSet = EnumSet.range(Season.SPRING, Season.FALL);
      }
    }
    
    ---
    seasonEnumSet
    4
    [SPRING,SUMMER, FALL, WINTER]
    
    copySeasonEnumSet
    [SPRING,SUMMER, FALL, WINTER]
    
    regionEnumSet
    [KOREA, CHINA]
    
    complementOfEnumSet
    [NORTHAMERICA, EUROPE]
    
    rangeEnumSet
    [SPRING, SUMMER, FALL]

     

     

     


    ※ 참조

    간단 정리 글

    velog.io/@jaden_94/11주차-항해일지-Enum

    velog.io/@ljs0429777/11주차-과제-Enum

    wisdom-and-record.tistory.com/52

     

    자세한 정리 글

    parkadd.tistory.com/50

    www.notion.so/Enum-6ffa87530c424d8ab7a1b585bfb26fa2

     

    ※ 스터디

    github.com/whiteship/live-study/issues/11

    'Java' 카테고리의 다른 글

    13. I/O  (0) 2021.02.24
    12. 애노테이션  (0) 2021.02.06
    10. 멀티쓰레드 프로그래밍  (0) 2021.01.27
    9. 예외처리  (0) 2021.01.17
    8. 인터페이스  (0) 2021.01.09
킹수빈닷컴