11주차 과제: Enum #11
목표
자바의 열거형에 대해 학습하세요.
학습할 것 (필수)
enum 정의하는 방법
한정된 수의 값만 갖는 데이터들을 열거타입(enumeration type)으로 정의한다. ex) 월, 화, 수, 목, 금, 토, 일 / 봄, 여름, 가을, 겨울
대문자, 여러 단어로 연결 시 _로 연결
enum 열거 타입 이름 { 값, 값2, ... // 대문자, 여러 단어로 연결 시 _로 연결 }
enum Season { // enum 키워드를 이용해
SPRING, SUMMER, FALL, WINTER // 열거 상수(enum constant)
}
열거 타입 사용 방법 변수 타입으로 사용할 수 있다.
Season season = Season.SPRING;
열거 타입은 클래스와 비슷해 보이지만 객체를 만들 수 없다는 점이 클래스와 다르다.(new 연산자 사용 불가)
enum이 제공하는 메소드 (values()와 valueOf())
열거 타입은 컴파일을 하고 나면 내부적으로 클래스로 만들어진다. 그리고 그 클래스에는 values와 valueOf 정적 메소드(static method)가 자동으로 추가된다.
-
values()
열거 타입에 속하는 모든 열거 상수들을 배열에 담아서 리턴하는 메소드Season seasons[] = Season.values(); for (Season season : seasons) { System.out.println(season); }
SPRING SUMMER FALL WINTER
-
valueOf()
열거 상수의 이름을 문자열로 넘겨주면 그에 해당하는 열거 상수를 리턴하는 메소드Season season = Season.valueOf("SPRING"); System.out.println(season); season = Season.valueOf("FALL"); System.out.println(season);
SPRING FALL
-
열거 상수를 다른 값과 연관짓기
열거 타입은 특별한 형태의 클래스이며, 일반 클래스와 같이 생성자가 있어야 한다. 없을 시, default 생성자를 만든다.enum Season { SPRING("봄"), SUMMER("여름"), FALL("가을"), WINTER("겨울"); final private String name; // 반드시 private 으로 지정해야 한다. Season(String name){ this.name = name; } String value(){ return name; } }
System.out.println(Season.SPRING.value()); System.out.println(Season.FALL.value());
봄 가을
java.lang.Enum
Class Enum<E extends Enum
final enum me/Test$Season extends java/lang/Enum {
...
}
Modifier and Type | Method | Description |
---|---|---|
protected void | finalize() | Enum 클래스가 final 메소드를 가질 수 없음 |
String | name() | 열거 상수의 이름을 반환 |
int | ordinal() | 열거 상수의 순서를 반환 |
EnumSet
아이템 36. 비트 필드 대신 EnumSet을 사용하라
java.util 패키지의 EnumSet 클래스는 열거 타입 상수의 값으로 구성된 집함을 효과적으로 표현해준다. Set 인터페이스를 완벽히 구현하며, 타입 안전하고, 다른 어떤 Set 구현체와도 함께 사용할 수 있다. 하지만 EnumSet의 내부는 비트 벡터로 구현되었다.
public class Season { // 비트 필드 열거 상수 - 구닥다리 기법!
public static final int SPRING = 1 << 0; // 1
public static final int SUMMER = 1 << 1; // 2
public static final int FALL = 1 << 2; // 4
public static final int WINTER = 1 << 3; // 8
}
public class Season { // 비트 필드를 대체하는 현대적 기법
public enum Season {SPRING, SUMMER, FALL, WINTER}
}
참고 서적
뇌를 자극하는 Java 프로그래밍 - 김윤명
이펙티브 자바 - 조슈아 블로크