[JAVA] 열거형(enum)이란?
📑 열거형이란?
열거형은 여러 상수를 선언해야 할 때, 편리하게 선언할 수 있는 방법이다. 일반적으로 상수를 선언할 때 다음과 같이 하는데, 이처럼 상수가 많을 때는 코드가 불필요하게 길어진다.
class Card{
static final int CLOVER=0;
static final int HEART=1;
static final int DIAMOND=2;
static final int SPADE=3;
static final int TWO = 0;
static final int THREE = 1;
static final int FOUR = 2;
final int kind;
final int num;
Card(int kind, int num) {
this.kind = kind;
this.num = num;
}
}
이럴 때, 열거형을 이용하면 다음과 같이 간단히 상수를 선언할 수 있다. 위와 달리 따로 값을 지정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당한다.
class Card{
enum Kind { CLOVER, HEART, DIAMOND, SPADE}
enum Value {TWO,THREE,FOUR}
final Kind kind;
final Value value;
}
열거형을 이용해서 상수를 정의한 경우, 값을 비교하기 전에 타입을 먼저 비교하므로 값이 같더라도 타입이 다르면 컴파일 에러가 발생한다.
if(Card.kind.CLOVER == Card.Value.TWO) //컴파일 에러 : 타입 다름
열거형의 조상 - java.lang.Enum 메서드 살펴보기
📌 String name()
: 열거형 상의 이름을 문자열로 반환한다.
public class Ex12_5_enum {
Kind kind = Kind.CLOVER;
System.out.println("kind.name() = " + kind.name());
}
enum Kind{
CLOVER("클로버"),
HEART("하트"),
DIAMOND("다이아몬드"),
SPADE("스페이드");
private final String kind;
Kind(String kind) {
this.kind = kind;
}
public String getKind(){
return kind;
}
}
name()을 사용하면 CLOVER라는 값이 출력된다. 아래 메서드 설명시에도 Kind 이넘을 사용하는 것이니 참고!
📌 Oridinal()
:열거형 상수가 정의된 순서를 반환한다.
int ordinal = Kind.DIAMOND.ordinal();
System.out.println("ordinal = " + ordinal);
위의 코드에서 2가 출력되는데 DIAMOND가 0,1,2,3번째 중 2번째에 있기 때문이다.
📌 CompareTo()
: 매개값으로 주어진 열거 객체를 기준으로 전 후로 몇 번째 위치하는지 비교
Kind diamond = Kind.DIAMOND;
Kind clover = Kind.CLOVER;
System.out.println(diamond.compareTo(clover)); //2
System.out.println(clover.compareTo(diamond)); //-2
📌 valueOf()
: 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다. 외부로부터 문자열을 받아 열거 객체로 변환할 때 유용하다.
Kind diamond1 = Kind.valueOf("DIAMOND");
System.out.println("diamond1 = " + diamond1);
반환값은 DIAMOND
📌 values()
:열거 타입의 모든 열거 객체들을 배열로 만들어 리턴
System.out.println(Arrays.toString(Kind.values()));
for (Kind type : Kind.values()) {
System.out.println(type);
}
📑 열거형에 멤버 추가하기 ( 상수를 다른값과 연결 )
Enum 클래스에 정의된 oridinal()이 열거형 상수가 정의된 순서를 반환하지만, 이 값을 여거형 상수의 값으로 사용하지 않는 것이 좋다. 이 값은 내부적인 용도로만 사용되기 위한 것이기 때문이다. 열거형 상수 값이 불규칙인 경우 다음과 같이 열거형 상수 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.
enum Direction{
EAST(1), SOUTH(5), WEST(-1), NORTH(10);
private final int value; //정수를 저장할 필드(인스턴스 변수) 추가
Direction(int value) {
this.value = value;
}
public int getValue(){
return value;
}
}
열거형 인스턴스 변수는 반드시 final이어야 한다는 제약은 없지만, value는 열거형 상수 값을 저장하기 위한 것이므로 보통 final을 붙인다. 그 값을 얻기 위해 getValue()도 생성하였다.
열거형 생성자는 외부에서 호출이 불가능하다. 열거형 생성자는 제어자가 묵시적으로 private이기 때문에!