ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 열거형(enum)이란?
    프로그래밍 언어/JAVA 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이기 때문에!

     

     

    반응형

    댓글

Designed by Tistory.