ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 열거형(Enum Types)
    백엔드/자바 2021. 5. 22. 19:48

    열거(enum)형이란?

    서로 관련된 상수들을 편리하게 선언하기 위한 목적으로 만들어진 것.

     

    미리 정의된 상수들을 모아둔 집합으로 특수한 데이터 유형이다.

    열거(enum)형 데이터 선언하는 방법

     

    열거형 데이터를 선언하는 방법은 아주 간단하다.

     

    class를 선언하는 것처럼 자료형 선언하고 자료형 이름을 적고 중괄호 { }안에 상수를 적는다.

     

     

     

    enum을 사용하면 위와 같이 번거롭게 상수 지정을 해야했던 것과 달리 편하게 상수 지정이 가능하다.

    열거(enum)형의 조상 - java.lang.Enum

    Object 클래스와 마찬가지로 열거형도 Enum이라는 클래스가 존재한다.

     

    그래서 Enum 자료형을 사용하면 Enum 조상 클래스가 가진 메서드도 사용이 가능하다.

     

    다음은 Enum 클래스가 가진 메서드다.

     


    메서드


    설명


    values( )


    열거형의 모든 상수를 배열에 담아 반환한다.

    String name( )
    열거형 상수의 이름을 문자열로 반환함.


    int ordinal()


    열거형 상수가 정의된 순서를 반환한다.(0부터 시작)


    T valueOf
    (Class<T> enumType, String name)


    지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.


    Class<E> getDeclaringClass()


    열거형의 Class 객체를 반환한다.

    열거(enum)형 사용하기

     

    우선 enum은 위와 같이 만들어준다.

     

     

     

    enum에 저장된 상수를 사용하기 위해서는 enum데이터명을 자료형으로 하는 변수를 선언한다.

     

    그 뒤에 "enum명.상수명"라는 방식으로 변수에 상수를 저장해준다.

     

    혹은 enum조상 클래스의 메서드인 valueOf()와 Enum.valueOf()를 사용해준다.

     

     

     

    다음으로는 values( ) 메서드인데 enum 자료에 저장된 모든 자료를 배열에 담아 반환한다.

     

     

     

    배열을 출력할 때는 위와 같이 출력하면 된다.

     

    Cardinal 변수인 a만 출력해도 되고, enum 조상 클래스가 제공하는 name()과 ordinal()을 사용해도 된다.

     

     

     

    위는 출력한 결과물인데, name()은 해당 상수의 이름을 반환하는 메서드다.

     

    ordinal( )은 enum에 저장한 순서에 맞게 자동 부여되는 인덱스를 반환하는 메서드다.

     

    위에서는 East -> West -> South -> North 순으로 저장했으므로 0, 1, 2, 3이 순서대로 출력된다.

     

     

     

    enum 데이터형 변수를 이용해 switch 사용도 가능하다.

    enum 데이터 비교하기

     

    enum에 저장된 상수끼리 비교할 경우 위와 같은 결과를 확인할 수 있다.

     

    equals()는 둘이 다른 상수이기 때문에 false를 반환한다.

     

    compareTo()는 cp1의 인덱스인 0에서 cp2의 인덱스 1를 빼줘서 -1을 반환한다.

     

    마지막으로 등가 연산자 비교도 둘이 다른 상수이기 때문에 false를 반환한다.

     

    이 내용을 보면 알겠지만 enum에 저장된 상수들이 객체임을 확인할 수 있다.

     

    equlas() 메서드와 compareTo() 메서드는 객체끼리 사용할 수 있기 때문이다.

    enum 상수에 값 추가하기

    지금까지 설명한 내용을 바탕으로 enum에 대해서 알 수 있는 중요한 사실 한 가지는 다음과 같다.

     

    - enum에 저장되는 각 상수는 객체다.

     

    그래서 enum을 사용해서 상수에 값을 추가해줄 때는 객체를 다루듯이 다뤄야 한다.

     

     

    일반적인 상수 선언같이 해주면 편할 수 있지만, 위에서 말한대로 enum의 상수들은 객체다.

     

    그래서 별도의 값을 추가하기 위해선 생성자, 인스턴스 변수가 필요하다.

     

     

     

    위와 같은 enum 자료가 있다고 가정해보자.

     

     

     

    상수 별로 정수형 자료, 문자열 자료를 추가하려면 위와 같이 하면 된다.

     

    이전에 이야기했듯이 enum의 각 상수는 객체처럼 다뤄야한다.

     

    그래서 위와 같이 상수에 값을 추가하면 그 값들은 생성자를 통해서 추가해야 한다.

     

    위에서는 2개의 값만 지정했으므로 2개의 멤버를 추가해줬는데,

     

    더 많은 값을 지정하고 싶으면 더 많은 멤버를 추가하고 생성자를 수정하면 된다.

     

    enum의 상수 하나 하나를 클래스라 생각하고 다루면 훨씬 편하다.

     

     

     

    만약 각 상수에 저장된 값을 불러오고 싶다면 get메서드를 추가해주면 된다.

     

    이제 위 내용들을 직접 사용해보자.

     

     

     

    우선 각 상수를 불러오는 방법은 이전 단락들에서 한대로 하면 된다.

     

    그리고 get 메서드를 이용하면 상수에 저장된 값을 반환받을 수 있다.

     

     

     

     

    values()를 이용해서 상수들을 배열로 전달 받아서 위와 같이 사용도 가능하다.

    enum 상수에 메서드 추가하기

    마지막으로 각 상수는 객체이므로 메서드까지 추가해줄 수 있다.

     

    메서드는 우선 enum 안에 추상 메서드를 추가하고 상수들이 그것을 구현하도록 하는 방법을 쓴다.

     

    코드로 보면 다음과 같다.

     

     

    우선 enum 안에 위와 같이 추상 메서드를 추가한다.

     

    이렇게 할 경우 enum 안의 모든 상수는 상속클래스처럼 이 추상 메서드를 구현할 의무를 갖는다.

     

     

     

    그리고 나선 위와 같이 각 상수별로 중괄호를 { } 치고 그 안에 추상 메서드를 구현하면 된다.

     

     

     

    그리고나서는 static 메서드를 쓰듯이 써주면 enum 상수 내부에 구현한  메서드를 사용할 수 있다.

Designed by Tistory.