2 minute read

목표

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

학습할 것 (필수)

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> // E - The enum type subclass 모든 자바 언어 열거 타입의 공통 기본 클래스로 모든 열거형은 이 클래스를 암묵적으로 상속 받는다.

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 프로그래밍 - 김윤명
이펙티브 자바 - 조슈아 블로크


live-study with whiteship
Oracle docs