열거형 ?
- 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용.
- 열거형이 갖는 값 + 타입까지 관리
- 상수 값 변경 시 다시 Compile할 필요가 없다.
- 열거형 상수 하나하나가 객체이다.
class Card{
// 클래스 변수
// final : 상수
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;
}
class CardEnum{
enum Kind {CLOVER, HEART, DIAMONT, SPADE};
enum Value { TWO, THREE, FOUR };
final Kind kind;
final Value value;
public CardEnum(Kind kind, Value value) {
this.kind = kind;
this.value = value;
}
}
public class EnumStudy {
public static void main(String[] args) {
// 상수 비교 시 값이 같으면 True
if ( Card.CLOVER == Card.TWO){
System.out.println("true");
}
// Enum 타입 비교 시 값이 같아도 타입이 다르면 컴파일 에러 발생
// java: incomparable types: jungsuk.chap12.CardEnum.Kind and jungsuk.chap12.CardEnum.Value
if (CardEnum.Kind.CLOVER == CardEnum.Value.TWO){
System.out.println("true");
}
}
}
enum Direction{ EAST, SOUTH, WEST, NORTH }
class DirectionClass{
static final DirectionClass EAST = new DirectionClass("EAST");
static final DirectionClass WEST = new DirectionClass("WEST");
static final DirectionClass SOUTH = new DirectionClass("SOUTH");
static final DirectionClass NORTH = new DirectionClass("NORTH");
private String name;
public DirectionClass(String name) {
this.name = name;
}
}
열거형 정의 및 사용 ?
정의 : enum 열거형명 { 상수명1, 상수명2 , ... }
사용 : 열거형명.상수명
- 비교 연산 시 == 으로 비교 가능 (단, < , > 사용 불가)
- compareTo()를 통해서 비교 가능 ( 같으면 0 , 왼쪽 크면 양수 , 오른쪽 크면 음수)
- switch문 조건식에도 사용가능
// 열거형 정의
enum Direction{
EAST, SOUTH, WEST, NORTH
}
class Unit{
int x, y;
Direction dir;
void init(){
// 사용 : 열거형명.상수명
dir = Direction.EAST;
}
void compare(){
if(dir == Direction.EAST){
x++;
} else if( dir > Direction.WEST){ // ERROR : 열겨형 상수에 비교연산자 불가
} else if( dir.compareTo(Direction.SOUTH) > 0){
....
}
}
void move(){
switch (dir){
// Direction.EAST로 사용하면 X
case EAST : x++; break;
case WEST : x--; break;
case SOUTH: y++; break;
case NORTH: y--; break;
}
}
}
모든 열거형의 조상 - java.lang.Enum

메서드 |
설명 |
Class<E> getDeclaringClass() | 열거형의 Class객체를 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서를 반환 (0부터 시작) |
T valueOf( Class<T> enumType, String name) |
지정된 열거형에서 name과 일치하는 열거형 상수 반환 |
열거형에 멤버 추가 ?
- ordinal()을 통해서 열거형 상수의 순서가 반환되지만 내부적인 용도로만 사용하는 것이 좋다.
- 열거형 상수 옆 () 안에 원하는 상수 값을 지정해줄 수 있다.
- () 안에 값을 지정해 줄 경우 값을 저장할 인스턴스 변수 + 생성자를 추가해주어야 한다.
- () 로 값을 사용할 경우 마지막 열거형 상수에 세미콜론 ( ; )을 사용
- 값에 필요에 따라 ()안에 여러개를 지정 가능 -> 값을 저장하기 위한 인스턴스 변수, 생성자가 필요
enum Direction{
// 열거형 상수에 원하는 값을 지정
EAST(1), SOUTH(5), WEST(-1), NORTH(10);
// 값 저장을 위한 인스턴스 변수
private final int value;
// 생성자
// 기본적으로 접근제어자가 private이기에 외부에서 직접 생성자로 생성할 수 없다.
Direction(int value) { this.value = value; }
// 외부에서 값을 사용하기 위한 getter
public int getValue() { return value; }
}
class Test{
public static void main(String[] args){
Direction d = new Direction(1) ; // 할 수 x
}
}
// 추가적인 값을 지정할 시 Case
enum Direction{
EAST(1, ">"), SOUTH(5, "V"), WEST(-1, "<"), NORTH(10, "^");
// 값 저장을 위한 인스턴스 변수
private final int value;
private final String symbol;
// 생성자
// 기본적으로 접근제어자가 private이기에 외부에서 직접 생성자로 생성할 수 없다.
Direction(int value, String symbol) {
this.value = value;
this.symbol = symbol;
}
// 외부에서 값을 사용하기 위한 getter
public int getValue() { return value; }
public int getSymbol() { return symbol; }
}
추상 메서드 추가하기
- 추상 메서드 선언 시 열거형 상수는 반드시 추상 메서드를 구현해야한다.
enum Transfortation{
// 추상 메서드가 있을 시 반드시 열거형 상수에서 구현해줘야한다.
BUS(100){int fare(int distance){return BASIC_FARE * distance;}} ,
TRAIN(150){int fare(int distance){return BASIC_FARE * distance;}} ,
SHIP(200){ int fare(int distance){ return BASIC_FARE * distance;}};
protected final int BASIC_FARE;
Transfortation(int basicFare) {
this.BASIC_FARE = basicFare;
}
abstract int fare(int distance);
public int getBASIC_FARE() {return BASIC_FARE;}
}
'P.L > Java' 카테고리의 다른 글
컬렉션 프레임워크(List, Set, Map) (0) | 2023.05.11 |
---|---|
Generics (0) | 2023.05.10 |
유용한 배열 사용 - java.util.Arrays 클래스 (0) | 2023.02.08 |
예외처리(Exception handling) (0) | 2023.02.01 |
java.lang.Character 클래스 (0) | 2023.01.28 |