-
목표
자바의 열거형에 대해 학습하세요.
학습할 것 (필수)
- 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
자세한 정리 글
www.notion.so/Enum-6ffa87530c424d8ab7a1b585bfb26fa2
※ 스터디