프로그래밍 언어/JAVA

[JAVA] 열거형(enum)이란?

s워니얌 2022. 10. 24. 23:16

 

📑 열거형이란?

 

열거형은 여러 상수를 선언해야 할 때, 편리하게 선언할 수 있는 방법이다. 일반적으로 상수를 선언할 때 다음과 같이 하는데, 이처럼 상수가 많을 때는 코드가 불필요하게 길어진다.

 

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이기 때문에!

 

 

반응형