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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.