티스토리 뷰

JAVA

[Java Study 11] Enum

DevBee 2021. 5. 11. 20:31

Enum (열거형)

Enum은 서로 연관된 상수들의 집합입니다. 자바에서는 final 키워드를 사용하여 고정된 값을 상수라고 합니다. 어떤 클래스가 상수로만 이루어져 있다면 class 대신 enum 키워드를 사용하여 상수 집합을 만들 수 있습니다. 

 

한정된 데이터만을 가지는 타입을 열거 타입(Enumeration Type)이라고 하며 열거타입에 들어가는 값(월, 화 ,수 등)들을 열거 상수(Enumeration constant)라고 합니다.

 

JAVA에서 열거 상수는 상수 각각을 내부적으로 public static final 필드이면서 객체로 제공되도록 합니다. static이 붙어있기 때문에 각각의 상수는 클래스변수로 클래스로더가 로드 시점에 JVM Method영역에 해당 클래스 변수들을 항상 상주시켜 프로그램이 종료되기 전에는 언제든지 가져다 쓸 수 있는 주소공간을 확보합니다.

 

enum을 정의하는 방법은 다음과 같습니다.

 

enum 열거체이름 { 상수1이름, 상수2이름, ... }


Week.java
public enum Week {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

 

enum을 사용하는 방법은 다음과 같습니다.

 

Week today = Week.SUNDAY

 

사용 방법은 클래스의 인스턴스를 생성하는 것과 유사하지만 new 키워드가 없습니다.

 

어떤 클래스에서든 위와 같은 구문을 만나면 Heap 영역에 Week 객체의 상수가 java.lang.Enum 클래스를 상속받은 고유의 객체로 각각 생성되고 Method 영역의 열거 상수들은 Heap 영역에 생성된 객체를 가리키게 됩니다.

 

 

today 변수는 Stack 영역에 생기며 Method 영역에 있는 SUNDAY 주소 값을 그대로 복사하여 Heap 영역에 있는 객체를 가리키게 됩니다.

 

 

이러한 이유로 today == Week.SUNDAY 가 true 입니다.

 

Week thisWeek = Week.SUNDAY;
Week nextWeek = Week.SUNDAY;
thisWeek == nextWeek; // true

 

java.lang.Enum

Enum 클래스는 모든 자바 열거체의 공통된 조상 클래스입니다.

Enum 클래스에는 열거체를 조작하기 위한 다양한 메소드가 포함되어 있습니다.

 

values()

values() 메소드는 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환합니다. 이 메소드는 자바의 모든 열거체에 컴파일러가 자동으로 추가해주는 메소드입니다.

 

enum Rainbow {
    RED,
    ORANGE,
    YELLOW,
    GREEN,
    BLUE,
    INDIGO,
    VIOLET
}

public class Main {
    Rainbow[] values = Rainbow.values();
    for (Rainbow rainbow : values) {
        System.out.println(rainbow);
    }
}

// 결과
RED
ORANGE
YELLOW
GREEN
BLUE
INDIGO
VIOLET

 

valueOf()

valueOf() 메소드는 전달된 문자열과 일치하는 해당 열거체 상수를 반환합니다.

 

enum Rainbow {
    RED,
    ORANGE,
    YELLOW,
    GREEN,
    BLUE,
    INDIGO,
    VIOLET
}

public class Main {
    Rainbow value = Rainbow.valueOf("YELLOW");
    System.out.println(value);
}

// 결과
YELLOW

 

ordinal()

ordinal() 메소드는 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환합니다. 이때 반환되는 값은 열거체 정의에서 해당 열거체 상수가 정의된 순서이며 상숫값 자체가 아닙니다.

 

enum Rainbow {
    RED,
    ORANGE,
    YELLOW,
    GREEN,
    BLUE,
    INDIGO,
    VIOLET
}

public class Main {
    public static void main(String[] args) {
        int idx = Rainbow.YELLOW.ordinal();
        System.out.println(idx);
    }
}

// 결과
2

 

대표적인 Enum 메소드는 다음과 같습니다.

 

메소드 설명
static E values() 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환
static E valueOf(String name) 전달된 문자열과 일치하는 해당 열거체의 상수를 반환
protected void finalize() 해당 Enum 클래스가 final 메소드를 가질 수 없게 됨
String name() 해당 열거체 상수의 이름을 반환
int ordinal() 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환

 

EnumSet

EnumSet은 열거형 타입으로 지정해 놓은 요소들을 배열처럼 다룰 수 있는 기능을 제공하는 Set입니다. EnumSet은 원소의 개수가 64(2^6)개를 넘지 않는 경우 메모리를 적게 차지하고 속도도 빠른 비트필드를 사용합니다. 또한 EnumSet은 enum과 static 메소드로 구성되어 있어 안정성을 추구하며 편리하게 사용할 수 있습니다.

 

간단한 EnumSet 예제를 살펴보겠습니다.

 

package study.enumsample;

import java.util.EnumSet;

public class DayEnum {
    enum Day {
        SUNDAY,
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY
    }

    public static void main(String[] args) {
        EnumSet enumSet = EnumSet.allOf(Day.class);
        EnumSet es = EnumSet.copyOf(enumSet);  // enumSet.clone()
        System.out.println("EnumSet.allOf() - " + es);
        es = EnumSet.noneOf(Day.class);
        System.out.println("EnumSet.noneOf() - " + es);

        es = EnumSet.of(Day.MONDAY, Day.FRIDAY);
        System.out.println("EnumSet.of() - " + es);
        es = EnumSet.complementOf(es);
        System.out.println("EnumSet.complementOf() - " + es);
        es = EnumSet.range(Day.MONDAY, Day.FRIDAY);
        System.out.println("EnumSet.range() - " + es);
    }
}

 

결과는 다음과 같습니다.

 

EnumSet.allOf() - [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]
EnumSet.noneOf() - []
EnumSet.of() - [MONDAY, FRIDAY]
EnumSet.complementOf() - [SUNDAY, TUESDAY, WEDNESDAY, THURSDAY, SATURDAY]
EnumSet.range() - [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]

 

✔️allOf() : 열거체에 있는 모든 상수를 가져옵니다.

✔️copyOf() (또는 clone()) : 같은 EnumSet을 하나 더 복사합니다.

✔️noneOf() : EnumSet을 비우는 메소드입니다.

✔️of() : 주어진 상수를 찾아 EnumSet을 구성합니다.

✔️complementOf() : 주어진 EnumSet을 제외하고 새로운 EnumSet을 구성합니다.

✔️range() : 주어진 상수 구간 내에 있는 상수들로 EnumSet을 구성합니다. (위 예제에서는 MONDAY부터 FRIDAY까지)

 

참고

- honbabzone.com/java/java-enum/

- tcpschool.com/java/java_api_enum

- alecture.blogspot.com/2012/11/enumset.html

'JAVA' 카테고리의 다른 글

[Java Study 13] I/O  (0) 2021.05.13
[Java Study 12] 애노테이션  (0) 2021.05.13
[Java Study 10] 멀티쓰레드 프로그래밍  (0) 2021.05.07
[Java Study 08] 인터페이스  (0) 2021.05.05
[Java Study 07] 패키지  (0) 2021.05.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함