0Pricing
Java Academy · 강의

EnumSet

열거형에 대한 빠른 집합 연산을 수행합니다

EnumSet은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

EnumSet이란 무엇인가요

EnumSet은 열거형 형식만을 위한 특수한 Set 구현입니다.

내부적으로는 비트 벡터를 사용하여 각 상수를 하나의 비트에 대응시킵니다. 따라서 열거형으로 구성된 HashSet과 비교하면 매우 빠르고 메모리 효율적입니다.

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
        System.out.println(weekend);
    }
}

of로 생성하기

EnumSet.of(...) 팩토리는 나열된 상수로 집합을 생성합니다. 원소 하나부터 다섯 개까지를 받는 오버로드와 가변 인자를 받는 버전이 있습니다.

import java.util.EnumSet;

public class Main {
    enum Perm { READ, WRITE, EXECUTE }
    public static void main(String[] args) {
        EnumSet<Perm> perms = EnumSet.of(Perm.READ, Perm.WRITE);
        System.out.println(perms);
    }
}

allOf 및 noneOf

두 가지 팩토리가 더 있습니다.

  • allOf(Type.class)는 모든 상수를 포함하는 집합을 생성합니다.
  • noneOf(Type.class)는 채워 넣을 수 있는 빈 집합을 생성합니다.
import java.util.EnumSet;

public class Main {
    enum Color { RED, GREEN, BLUE }
    public static void main(String[] args) {
        EnumSet<Color> all = EnumSet.allOf(Color.class);
        EnumSet<Color> none = EnumSet.noneOf(Color.class);
        none.add(Color.RED);
        System.out.println("all: " + all);
        System.out.println("built: " + none);
    }
}

연속된 상수에 range 사용하기

EnumSet.range(from, to)는 두 끝점 사이의 모든 상수를 선언 순서대로 양 끝점을 포함하여 담습니다.

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> workdays = EnumSet.range(Day.MON, Day.FRI);
        System.out.println(workdays);
    }
}

complementOf

EnumSet.complementOf(set)은 주어진 집합에 없는 모든 상수의 집합을 반환합니다.

선택 항목을 빠르게 반전하는 방법입니다.

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> work = EnumSet.range(Day.MON, Day.FRI);
        EnumSet<Day> rest = EnumSet.complementOf(work);
        System.out.println(rest);
    }
}

집합 연산

EnumSet은 실제 Set이므로 addAll, retainAll, removeAll을 통해 합집합, 교집합, 차집합을 구할 수 있습니다.

내부적으로는 이러한 연산이 매우 빠른 비트 단위 연산으로 실행됩니다.

import java.util.EnumSet;

public class Main {
    enum Tag { A, B, C, D }
    public static void main(String[] args) {
        EnumSet<Tag> x = EnumSet.of(Tag.A, Tag.B, Tag.C);
        EnumSet<Tag> y = EnumSet.of(Tag.B, Tag.C, Tag.D);
        EnumSet<Tag> inter = EnumSet.copyOf(x);
        inter.retainAll(y);
        System.out.println("intersection: " + inter);
    }
}

멤버 포함 여부 검사

contains는 하나의 비트만 검사하므로 일정한 시간에 매우 빠르게 실행됩니다.

import java.util.EnumSet;

public class Main {
    enum Feature { DARK_MODE, BETA, ANALYTICS }
    public static void main(String[] args) {
        EnumSet<Feature> enabled = EnumSet.of(Feature.DARK_MODE, Feature.BETA);
        System.out.println(enabled.contains(Feature.BETA));
        System.out.println(enabled.contains(Feature.ANALYTICS));
    }
}

플래그를 대체하는 EnumSet

EnumSet이 없던 시절에는 프로그래머가 READ | WRITE와 같은 int 비트 플래그를 사용했습니다. EnumSet은 이를 형식 안전성과 가독성을 갖춘 방식으로 대체합니다.

오류가 발생하기 쉬운 수동 마스킹 없이 비트 필드의 성능을 얻을 수 있습니다.

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Style { BOLD, ITALIC, UNDERLINE }
    static void render(Set<Style> styles) {
        System.out.println("Applying: " + styles);
    }
    public static void main(String[] args) {
        render(EnumSet.of(Style.BOLD, Style.UNDERLINE));
    }
}

선언 순서로 순회하기

EnumSet은 상수의 자연 순서, 즉 선언 순서로 순회합니다.

따라서 HashSet과 달리 예측 가능하고 안정적인 순회가 가능합니다.

import java.util.EnumSet;

public class Main {
    enum Phase { ALPHA, BETA, RC, GA }
    public static void main(String[] args) {
        EnumSet<Phase> set = EnumSet.of(Phase.GA, Phase.ALPHA, Phase.RC);
        for (Phase p : set) System.out.println(p);
    }
}

copyOf로 방어적 복사하기

EnumSet.copyOf(collection)는 열거형 값으로 구성된 어떤 컬렉션에서도 EnumSet을 생성합니다. 안전한 복사본을 만들거나 List를 변환할 때 사용합니다.

import java.util.EnumSet;
import java.util.List;

public class Main {
    enum Role { ADMIN, EDITOR, VIEWER }
    public static void main(String[] args) {
        List<Role> source = List.of(Role.EDITOR, Role.VIEWER);
        EnumSet<Role> roles = EnumSet.copyOf(source);
        System.out.println(roles);
    }
}

빠른 이유

상수가 64개 이하인 열거형의 경우 EnumSet은 비트 벡터로 하나의 long을 사용합니다. 각 연산은 한두 개의 기계어 명령어로 실행됩니다.

열거형 집합에는 항상 HashSet<MyEnum>보다 EnumSet을 우선 사용하세요.

import java.util.EnumSet;

public class Main {
    enum Bit { B0, B1, B2, B3 }
    public static void main(String[] args) {
        EnumSet<Bit> s = EnumSet.of(Bit.B0, Bit.B2);
        // contains is a single bit-and under the hood
        System.out.println(s.contains(Bit.B2));
    }
}

빠른 확인

EnumSet에 대한 지식을 확인해 보세요.

복습

EnumSet을 배웠습니다.

  • 열거형을 위한 비트 벡터 Set으로, 매우 빠르고 간결합니다.
  • 팩토리: of, allOf, noneOf, range, complementOf, copyOf.
  • 선언 순서로 순회합니다.
  • int 비트 플래그를 형식 안전하게 대체합니다.

다음에는 대응되는 Map 형식인 EnumMap을 살펴봅니다.

import java.util.EnumSet;

public class Main {
    enum X { A, B }
    public static void main(String[] args) {
        System.out.println("EnumSet recap: " + EnumSet.allOf(X.class));
    }
}

자주 묻는 질문

“EnumSet” 강의는 무료인가요?

네 — “EnumSet” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“EnumSet”에서 뭘 배우나요?

열거형에 대한 빠른 집합 연산을 수행합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“EnumSet” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 필드와 메서드가 있는 열거형
  2. 열거형의 추상 메서드
  3. EnumSet
  4. EnumMap
← Java Academy(으)로 돌아가기