티스토리 뷰

Java

11. Enum

kingsubin 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