Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

열거형(enum) 본문

Java/JAVA3

열거형(enum)

빌드이너프 2023. 7. 30. 10:36

열거형(enum)

관련된 상수들을 같이 묶어 놓은 것, JAVA는 타입에 안전한 열거형을 제공

 

위의 코드를

class Card {
    static final int CLOVER = 0;
    static final int HEAET = 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;
}

 

간단하게 열거형으로 정리

class Card { //      0,     1,       2,     3
    enum Kind { CLOVER, HEART, DIAMOND, SPADE } // 열거형 Kind를 정의, 자동으로 순서 0, 1, 2, 3 매겨짐
    enum Value { TWO, THREE, FOUR } // 열거형 Value를 정의
    
    final Kind kind; // 타입이 int가 아닌 Kind임에 유의
    final Value value;
}

 

 


열거형의 정의와 사용

열거형을 정의하는 방법

enum 열거형이름 { 상수명1, 상수명2, ... }

 

열거형 타입의 변수를 선언하고 사용하는 방법

enum Direction { EAST, SOUTH, WEST, NORTH }

class Unit {
    int x, y; // Unit의 위치
    Direction dir; // 열거형 인스턴스 변수를 선언, EAST, SOUTH, WEST, NORTH 값만 dir에 들어갈 수 있다
    
    void init() {
        dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
    }
}

 

열거형 상수의 비교에 ==와 compareTo() 사용가능

if(dir == Direction.EAST) { // true
    x++;
} else if(dir > Direction.WEST) { // 에러, 열거형 상수에 비교연산자 사용불가
    ...
} else if(dir.compareTo(Direction.WEST) > 0) { // compareTo()는 가능
    ...   
}

 

 


열거형의 조상 - java.lang.Enum

모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다

메서드 설명
Class<E> getDeclaringClass() 열거형의 Class 객체를 반환
String name() 열거형 상수의 이름을 문자열로 반환
int ordinal() 열거형 상수가 정의된 순서를 반환(0부터 시작)
T valueOf(Class<T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환

 

values(), valueOf()는 컴파일러가 자동으로 추가

static E[] values()
static E valueOf(String name)

Directing[] dArr = Direction.values();

for(Direction d : dArr) // for(Direction d : Direction.values())
    System.out.printf("%s=%d%n", d.name(), d.ordinal());

 


코드

//                  0,    1,    2,    3
enum Direction { EAST, SOUTH, WEST, NORTH }

class enumTest {
    public static void main(String[] args) {
        Direction d1 = Direction.EAST; // 열거형타입.상수
        Direction d2 = Direction.valueOf("WEST"); // 문자열 이용하여 열거형 상수 얻기
        Direction d3 = Enum.valueOf(Direction.class, "EAST"); // Enum 클래스(모든 열거형 최고 조상) 이용, valueOf 사용

        System.out.println("d1="+d1);
        System.out.println("d2="+d2);
        System.out.println("d3="+d3);
        System.out.println();

        System.out.println("d1==d2 ? "+ (d1==d2));
        System.out.println("d1==d3 ? "+ (d1==d3));
        System.out.println("d1.equals(d3) ? "+ d1.equals(d3));
//		System.out.println("d2 > d3 ? "+ (d1 > d3)); // 에러
        System.out.println();

        System.out.println("d1.compareTo(d3) ? "+ (d1.compareTo(d3)));
        System.out.println("d1.compareTo(d2) ? "+ (d1.compareTo(d2)));
        System.out.println();

        switch(d1) {
            case EAST: // Direction.EAST라고 쓸 수 없다
                System.out.println("The direction is EAST."); break;
            case SOUTH:
                System.out.println("The direction is SOUTH."); break;
            case WEST:
                System.out.println("The direction is WEST."); break;
            case NORTH:
                System.out.println("The direction is NORTH."); break;
            default:
                System.out.println("Invalid direction."); break;
        }

        Direction[] dArr = Direction.values();

        for(Direction d : dArr)  // for(Direction d : Direction.values())
            System.out.printf("%s=%d%n", d.name(), d.ordinal());
    }
}


d1=EAST
d2=WEST
d3=EAST

d1==d2 ? false
d1==d3 ? true
d1.equals(d3) ? true

d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2

The direction is EAST.
EAST=0
SOUTH=1
WEST=2
NORTH=3

'Java > JAVA3' 카테고리의 다른 글

Annotation(애너테이션) @  (0) 2023.07.31
열거형에 멤버 추가하기  (0) 2023.07.31
지네릭 형변환  (0) 2023.07.29
지네릭 메서드  (0) 2023.07.28
와일드 카드 <?>, 지네릭 메서드  (0) 2023.07.28