열거형(enums)

열거형 ?

- 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용.
- 열거형이 갖는 값 + 타입까지 관리
- 상수 값 변경 시 다시 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