코린이의 소소한 공부노트

열거형(enum, enumerated type) 본문

Java

열거형(enum, enumerated type)

무지맘 2022. 11. 17. 01:21

[열거형]

1. 관련된 상수들을 같이 묶어 놓는 것

2. 자바는 타입에 안전한 열거형을 제공한다.

  - 타입에 안전하다는 것은 값과 타입을 동시에 체크한다는 것을 말한다.

// 열거형을 쓰지 않았을 때			// 열거형을 쓸 때
class Card1{					class Card2{
    // 무늬					    // 무늬       0       1       2       3
    static final int CLOVER = 0;		    enum Kind { CLOVER, HEART, DIAMOND, SPADE }
    static final int HEART = 1			    // 열거형 Kind 정의
    static final int DIAMOND = 2;
    static final int SPADE = 3;
    // 숫자					    // 숫자       0     1     2
    static final int TWO = 0;			    enum Value { TWO, THREE, FOUR }
    static final int THREE = 1;			    // 열거형 Value 정의
    static final int FOUR = 2;
    // iv					    // iv
    final int kind;				    final Kind kind; // 타입이 int가 아닌 Kind
    final int num;				    final Value value;
}						}

Card1.CLOVER == Card1.TWO // true
// 무늬와 숫자는 다르기 때문에 의미상 false로 나와야 한다.
Card2.Kind.CLOVER == Card2.Value.TWO // 에러. 타입이 달라서 비교 불가
// 이게 우리가 원하는 방향의 결과다.

 

[열거형 정의하기]

1. enum 열거형이름 { 상수명1, 상수명2, ... } 형태로 정의해주면 된다.

enum Direction { EAST, SOUTH, WEST, NORTH } // EAST부터 0, 1, 2, 3
class Unit{
    int x, y; // 유닛의 위치
    Direction dir; // 열거형을 iv로 선언
    void init() { dir = Direction.EAST; } // 유닛의 방향을 EAST로 초기화
}

2. 열거형 상수를 비교할 때 ==compareTo()를 사용할 수 있다.

if(dir==Direction.EAST) { } // OK
else if(dir>Direction.WEST) { } // 에러. 비교 연산자는 사용 불가. 이유는 맨 아래에
else if(dir.compareTo(Direction.WEST)>0) { } // OK

 

[java.lang.Enum 클래스]

1. 모든 열거형의 조상 클래스이다.

2. Enum 클래스의 메서드

// 1) 기본 메서드

Class<E> getDeclaringClass()
// 열거형의 Class 객체를 반환한다.
 
String name()
// 열거형 상수의 이름을 문자열로 반환한다.
 
int ordinal()
// 열거형 상수가 정의된 순서를 반환한다. (0부터 시작)
// 실제 상수가 갖는 값과는 차이가 있을 수도 있다.
 
T valueOf(Class<T> enumType, String name)
// 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.
 
// 2) 컴파일러가 자동적으로 추가해주는 메서드
static E values()
static E valueOf(String name)

// 사용 예시
Direction[] dArr = Direction.values();
for(Direction d : dArr)
    System.out.printf(“%s=%d, ”, d.name(). d.ordinal()); // EAST=0, SOUTH=1, WEST=2, NORTH=3

Direction d = Direction.valueOf(“WEST”); // d = Direction.WEST
Direction d = Enum.valueOf(Direction.class, “EAST”); // 윗줄과 동일

 

[열거형에 멤버 추가하기]

1. 불연속적인 열거형 상수의 경우 원하는 값을 괄호() 안에 적는다.

enum Direction { EAST(1), SOUTE{5}, WEST(-1), NORTH(10) }
// ordinal()을 호출하면 0, 1, 2, 3이 된다.

enum Direction2 { EAST(1, ">"), SOUTH(2,"v"), WEST(3, "<"), NORTH(4,"^"); }
// ()안에 여러 값을 넣을 수도 있다.

2. 괄호를 사용하려면 iv와 생성자를 새로 추가해줘야 한다. 이때 괄호 안에 넣은 값의 개수만큼 iv를 추가해야 한다.

enum Direction { // 괄호 안의 값이 1개
    EAST(1), SOUTE{5}, WEST(-1), NORTH(10); // 끝에 ;를 추가해야 한다.
    
    private final int value; // 정수를 저장할 필드(iv) 추가
    
    Direction(int value) { this.value = value; } // 생성자 추가
    
    public int getValue() { return value; }
}

enum Direction2 { // 괄호 안의 값이 2개
    EAST(1, ">"), SOUTH(2,"v"), WEST(3, "<"), NORTH(4,"^");
 
    private final int value;
    private final String symbol;
 
    Direction2(int value, String symbol) { // 접근 제어자 private이 생략됨
    this.value = value;
    this.symbol = symbol;
    }
 
    public int getValue() { return value; }
    public String getSymbol() { return symbol; }
}

 3. 열거형의 생성자는 묵시적으로 private이므로 외부에서 객체 생성이 불가하다.

Direction d = new Direction(1); // 에러

 

[열거형의 이해]

enum Direction { EAST, SOUTE, WEST, NORTH }

- 열거형 Direction위 위와 같이 선언되어 있는 것은 아래와 같은 클래스로 선언된 것과 유사하다.

class Direction{
    static final Direction EAST = new Direction(“EAST”);
    static final Direction SOUTH = new Direction(“SOUTH”);
    static final Direction WEST = new Direction(“WEST”);
    static final Direction NORTH = new Direction(“NORTH”);
    
    private String name;
    private Direction(String name) { this.name = name; }
}
// 열거형 상수는 객체이기 때문에 비교 연산자 사용이 불가능하다!

'Java' 카테고리의 다른 글

애너테이션 만들기  (0) 2022.11.21
애너테이션의 정의와 종류  (0) 2022.11.17
지네릭 타입의 형변환과 제거  (0) 2022.11.14
와일드카드 ?와 지네릭 메서드  (0) 2022.11.14
지네릭 클래스의 예시와 제한  (0) 2022.11.14