enum은 서로 연관된 상수들의 집합을 의미한다.
enum 열거형 이름 { 상수명1, 상수명2, ... }
public enum Subject {
PE, MUSIC, ART
}
public class Main {
public static void main(String[] args) {
Subject subject = Subject.PE;
System.out.println(subject); // PE
switch(subject) {
case PE:
System.out.println("PE");
break;
case MUSIC:
System.out.println("MUSIC");
break;
case ART:
System.out.println("ART");
break;
}
}
}
enum을 사용하면 상수들을 저장하게 되는데 변수에 값을 할당할 수도 있고 이를 이용하여 switch문에도 사용할 수 있다.
리턴 타입 | 메서드 | 설명 |
---|---|---|
String | name() | 열거 객체가 가지고 있는 문자열을 리턴, 리턴되는 문자열은 열거타입을 정의할 때 사용한 상수 이름과 동일 |
int | ordinal() | 열거 객체의 순번(0부터 시작)을 리턴 |
int | compareTo(비교값) | 주어진 매개값과 비교해서 순번 차이를 리턴 |
열거 타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴 |
열거 배열 | values() | 모든 열거 객체들을 배열로 리턴 |
static final 키워드를 사용하면 상수를 지정할 수 있지만 여기에 몇가지 불편한 점이 있다.
static final int SPRING = 1;
static final int SUMMAR = 1;
static final int FALL = 1;
static final int WINTER = 1;
static final int DJANGO = 1;
static final int NEST = 1;
static final int SPRING = 3;
SPRING의 경우 중복 정의가 되어 있어 에러가 발생한다
class Seasons {
static final int SPRING = 1;
static final int SUMMAR = 1;
static final int FALL = 1;
static final int WINTER = 1;
}
class BackEndFrameWork {
static final int DJANGO = 1;
static final int NEST = 1;
static final int SPRING = 3;
}
SPRING이라는 상수는 Seasons class, BackEndFrameWork class에 각각 같은 이름으로 상수로 사용되고 있다. 타입은 int형이기 때문에 예를 들어 다음과 같은 구문이 있다고 하자.
if(Seasons.SPRING == BackEndFrameWork.SPRING) {...}
이 둘을 비교하면 int 타입을 비교하는 것이기 때문에 에러가 발생하지 않아 타입 안정성이 떨어진다.