[Java 기초] 열거형 - Enum

Updated:

이번 포스트에서는 자바의 상수값을 나열하여 저장하는 열거형 Enum에 대해서 알아보도록 하겠다. 👨‍🏫

📋 목차

  • enum 정의하는 방법
  • enum이 제공하는 메소드
  • java.lang.Enum
  • EnumSet

enum 정의하는 방법

enum 열거형이름 { 상수명1, 상수명2, … }

열거형 사용법 : 열거형이름.상수명

enum Direction { EAST, SOUTH, WEST, NORTH }

class Unit {
    int x, y;
    Dirction dir; // 열거형을 인스턴스 변수로 선언

    void init() {
        dir = Direction.EAST; // 열거형이름.상수명
    }
}
  • 열거형 상수 하나하나는 Direction 객체이다.
  • 열거형 상수간에 == 연산 가능.
  • <, > 비교연산자는 불가. compareTo$($)를 사용.

java.lang.Enum

열거형 이름.values$($) : 열거형의 모든 상수를 배열에 담아 반환.

java.lang.Enum은 모든 열거형의 조상이다.

열거형에 정의된 모든 상수를 출력하는 방법

Direction[] dArr = Direction.values(); // 열거형 Direction에 정의된 상수를 배열에 담아 반환

for(Direction d : dArr) {
  System.out.pritf("%s = %d%n", d.name(), d.ordinal()); // 열거형 상수와 번호(0부터)가 출력
}

enum이 제공하는 메서드

메서드 설명
Class«E>E> getDeclaringClass$($) 열거형의 Class객체를 반환한다.
String name$($) 열거형 상수의 이름을 문자열로 반환한다.
int ordinal$($) 0부터 열거형 상수가 정의된 순서를 반환한다.
T valueOf$($Class«T>T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.
enum Direction { EAST, SOUTH, WEST, NORTH }

class Example {
    public static void main(String[] args) {
        Direction d1 = Direction.EAST;
        Direction d2 = Direction.valueOf("WEST"); // WEST와 일치하는 상수를 반환
        Direction d3 = Enum.valueOf(Direction.class, "EAST"); // Direction 열거형에서 EAST와 일치하는 상수를 반환

        System.out.println("d1 =" + d1);
        System.out.println("d2 =" + d2);
        System.out.println("d3 =" + d3);

        System.out.println("d1==d2 ? " + (d1==d2)); // false
        System.out.println("d1==d3 ? " + (d1==d3)); // true
        System.out.println("d1.compareTo(d3) ? " + (d1.compareTo(d3))); // 0
        System.out.println("d1.compareTo(d2) ? " + (d1.compareTo(d2))); // -2

        switch (d1) {
            case EAST :
                System.out.println("Thr direction is EAST."); break;
            case SOUTH:
                System.out.println("The direction is SOUTH"); break;
            case WEST :
                System.out.println("The direction is WEST"); break;
            case NORTH:
                System.out.println("The direction is NORTH"); break;
            default :
                System.out.println("Invalid direction."); break;
        }

        Direction[] dArr = Direction.values();

        for(Direction d : dArr) System.out.printf("%s = %d%n", d.name(), d.ordinal()); // 이름 = 순서
    }
}

출력

d1 =EAST
d2 =WEST
d3 =EAST
d1==d2 ? false
d1==d3 ? true
d1.compareTo(d3) ? 0
d1.compareTo(d2) ? -2
Thr direction is EAST.
EAST = 0
SOUTH = 1
WEST = 2
NORTH = 3

enum에 멤버를 추가하는것도 가능하다.

enum Direction {
  // 열거형 상수에 value값 추가
  EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 ; 추가해야함.

  private final int value;
  Direction(int value) { this.value = value; } // 생성자 추가. 열거형의 생성자는 private이다.

  public int getValue() { return value; } // 외부에서 값을 얻을수 있게 하는 메서드
}

EnumSet

set 컬랙션에서는 중복된 데이터를 저장하지 못하고 데이터의 저장 순서가 보장되지 않는다.

EnumSet을 만들수 있는 메서드는 다양하다.

먼저 모든 요소를 포함하는 EnumSet은 allOf()로 만들 수 있다.

public enum Direction {
  EAST, SOUTH, WEST, NORTH
}

EnumSet<Direction> set = EnumSet.allOf(Direction.class);
set.forEach(System.out::println);

출력

EAST
SOUTH
WEST
NORTH

그 외의 EnumSet 생성 메서드

noneOf$($)

빈 Direction 컬렉션을 갖는 EnumSet을 만든다.

EnumSet<Direction> set = EnumSet.noneOf(Direction.class);

of$($)

들어갈 요소를 직접 입력하여 EnumSet을 만든다.

EnumSet<Direction> set = EnumSet.of(Direction.NORTHWEST);

complementOf$($)

원하는 요소를 제거하고 EnumSet을 생성한다.

EnumSet<Direction> set = EnumSet.complementOf(EnumSet.of(Direction.NORTHWEST));

copyOf$($)

다른 EnumSet의 모든 요소를 복사하여 EnumSet을 만든다.

EnumSet.copyOf(EnumSet.of(Direction.EAST, Direction.WEST));

EnumSet을 다루는 메서드

add$($)

EnumSet에 요소를 추가한다.

EnumSet<Direction> set = EnumSet.of(Direction.EAST, Direction.WEST);

set.add(Direction.SOUTH); // EnumSet set에 요소를 추가한다.

contains$($)

특정 요소가 EnumSet에 포함되어 있는지 확인한다.

EnumSet<Direction> set = EnumSet.of(Direction.EAST, Direction.WEST);

boolean isContain = set.contains(Direction.EAST);

if(isContain) System.out.println("EAST 포함");

remove$($)

EnumSet에 특정 요소를 삭제한다.

set.remove(Direction.EAST);

참조
Java의 정석 $($남궁 성)
whiteship 자바 라이브 스터디

Categories:

Updated:

Leave a comment