enum 정의하는 방법

해당 타입은 JDK 5에 추가되었으며, 상수들을 정의, 열거하는 데 사용되는 키워드이다.

 

기존에 사용되던 final static keyword를 사용한 변수 선언 등을 대체하였다.

 

 

해당 키워드의 특징으로는

  1. 모든 Java의 enum들은 암시적으로 java.lang.Enum Class를 확장한다.
  2. 정의된 상수 하나당 하나의 인스턴스가 생성된다. public static final type instance
  3. 데이터를 비교할 때 실제 값과 함께 타입을 체크한다.
  4. 메서드와 필드를 추가하고 인터페이스를 구현할 수 있다.
  5. 다른 Primitive Type Variable 과 같이 Switch Statement에서 사용할 수 있다.
  6. 정의 시 Class Level에서 사용된다.

정도가 있다.

 

 

enum 선언, 할당 방식

 

JDK 5.0 이전의 방식

Class Role {
        public final static int ADMIN = 0;
        public final static int USER = 1;
        public final static int GUEST = 2;
}

 

일반적인 선언, 할당

// 선언
public enum Role {
        ADMIN, USER, GUEST 
}

// 할당
Role role;

role = Role.ADMIN;
role = Role.USER;
role = Role.GUEST;

 

enum Class 내부에 Method, Variable 선언

public enum Role {
        ADMIN, USER, GUEST;

        //내부 변수
        private String a;
        private String b;

    //생성자 
        Role(String a, String b) {
                this.a = a;
                this.b = b;
        }

        public String getA() {
                return a;
        }

        public String getB() {
                return b;
        }    
}

 

 

enum 사용 방식

 

조건문 : if

if (role == Role.USER) {
        System.out.println("USER");
}
if (role == Role.GUEST) {
        System.out.println("GUEST");
}
if (role == Role.ADMIN) {
        System.out.println("ADMIN");
}

 

조건문 : Switch

switch (role) {
        case USER : 
                System.out.println("USER"); 
                break;
        case GUEST : 
                System.out.println("GUEST"); 
                break;
        case ADMIN : 
                System.out.println("ADMIN"); 
                break;
}

 

반복문 : for-each

for (Role role : Role.values()) {
        System.out.println(role);
}

 

 

enum이 제공하는 메서드 (values()와 valueOf())

컴파일러가 자동으로 추가해주는 메서드들이라고 한다.

 

values()

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

Role[] role = Role.values();

for (Role r : role) {
        System.out.println(r);
}

for (Role role : Role.values()) {
        System.out.println(role);
}

 

valueOf()

정의된 상수와 변수로 넘긴 문자열을 비교한 뒤 그 결과를 반환한다.

 

전달된 문자열과 동일한 상수가 없을 경우 NPE가 발생한다.

role = Role.valueOf("USER");

// NPE
role = Role.valueOf("aaa");

 

기타 메서드

 

ordinal()

현재 상수 값이 선언된 enum Class 내에서 어느 위치(index)에 있는지 반환하는 메서드이다.

상수의 위치가 변경되거나 새로운 상수가 추가된다면 해당 메서드를 사용한 로직들은 깨지게 된다.

int idx = role.ordinal();

 

compareTo()

상수의 ordinal 값을 이용하여 두 개의 상수를 비교하는 메서드이다. 반환 값은 int이다.

// return = self.ordinal - role.ordinal;
Role.USER.compareTo(role);

 

name()

정의된 상수의 이름을 문자열 형식 값으로 반환한다.

 

해당 메서드는 final 메서드이기에 재정의가 불가능하다.

String str = Role.User.name();

 

toString()

기본 정의로는 상수의 문자열 형식 값을 반환한다.

 

해당 메서드는 재정의가 가능하다.

String str = Role.USER.toString();

 

 

java.lang.Enum

Java의 enum들이 암시적으로 확장하는 Super Class이다.

 

컴파일러가 호출하는 생성자와 위에서 작성된 메서드를 제외하고도 Object.Class의 메서드들과 getDeclaring()가 포함되어 있다.

 

 

EnumSet

Set 인터페이스와 enum을 함께 사용하기 위해 일부 구현한 추상 클래스이다.

하위 구현체로는 RegularEnumSet, JomboEnumSet이 있다.

 

RegularEnumSet

단일 long의 각각의 비트가 enum 값을 나타내는 Set이다. 최대 64개의 요소를 저장한다.

 

JomboEnumSet

long 배열을 이용하여 enum 값을 나타내는 Set이다. 위와 같이 하나의 long 요소는 64개를 저장한다.

 

 

해당 Set의 특징

  1. 동기화되지 않았다.
  2. Null을 허용하지 않는다.
  3. Fail-safe Iterator를 사용한다. 이는 복제본을 만들고, 그 요소를 순회하는 방식을 말한다.
  4. enum 유형만을 사용하는 것을 강제한다.
  5. 각 요소의 저장되는 순서는 상수의 정의된 순서를 따른다.
  6. 모든 메서드는 산술 비트 연산을 사용하여 구현된다. 매우 빠른 성능을 지닌다.

 

EnumSet의 몇 가지 메서드

  • allOf() : 넘겨받은 enum.class의 모든 요소를 포함한 Set에 반환한다.
  • noneOf() : 비어있는 enum.class Type의 Set을 반환한다.
  • range() : 정의된 상수의 index 값을 기준으로 요소를 저장한다.
  • complementOf() : 해당 Set을 만들 때 전달된 요소들을 제외할 수 있다.
  • add, contains, forEach, remove 등과 같이 기존 메서드는 동일하게 사용 가능하다.

'Live Study' 카테고리의 다른 글

Live Study_Week 13. I/O  (0) 2021.02.20
Live Study_Week 12. Annotation  (0) 2021.02.02
Live Study_Week 09. 예외 처리  (0) 2021.01.11
Live Study_Week 08. 인터페이스  (0) 2021.01.05
Live Study_Week 07. 패키지  (0) 2020.12.28

+ Recent posts