English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 흐름 제어

Java 배열

Java 대상 지향(I)

Java 대상 지향(II)

Java 대상 지향(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 컬렉션

Java Set 컬렉션

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java EnumSet

이 튜토리얼에서는 예제를 통해 Java EnumSet 클래스와 그 다양한 메서드를 배웁니다.

Java 컬렉션 프레임워크의 EnumSet 클래스는 단일 열거형 요소의 컬렉션 구현을 제공합니다.

EnumSet를 공부하기 전에, Java 컬렉션 프레임워크의 EnumSet 클래스를 이해해야 합니다.Java 열거형.

Java Enums를 구현Set 인터페이스.

EnumSet 생성

열거 집합을 생성하기 위해 먼저 java.util.EnumSet 패키지를 가져와야 합니다.

기타 컬렉션 구현과 달리, 열거 집합에는 공용 생성자가 없습니다. 예약된 메서드를 사용하여 열거 집합을 생성해야 합니다.

1.allOf(Size)

allof() 메서드를 사용하여 지정된 열거형 타입 Size의 모든 값을 포함한 열거 집합을 생성합니다. 예를 들어,

import java.util.EnumSet;
class Main {
    //Size라는 열거형
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    
    public static void main(String[] args) {
        //allOf()를 사용하여 EnumSet을 생성합니다
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        System.out.println("EnumSet: ") + sizes);
    }
}

출력 결과

EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]

주의 선언

EnumSet<Size> sizes = EnumSet.allOf(Size.class);

여기서 Size.class은 생성한 Size 열거형을 의미합니다.

2.noneOf(Size)

noneOf() 메서드를 사용하여 빈 열거 집합을 생성합니다. 예를 들어,

import java.util.EnumSet;
class Main {
     //Size라는 열거형
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        // noneOf()를 사용하여 EnumSet을 생성합니다
        EnumSet<Size> sizes = EnumSet.noneOf(Size.class);
        System.out.println("빈 EnumSet: " + sizes);
    }
}

출력 결과

빈 EnumSet : []

여기서는 names이라는 빈 열거 집합을 생성했습니다.

주의위 프로그램에서만 Size 열거형 타입의 요소를 삽입할 수 있습니다. 이는 Size 열거형을 사용하여 빈 열거 집합을 생성했기 때문입니다.

3.range(e1,e2메서드

range() 메서드를 사용하여 e를 포함한 동일한 열거 집합을 생성합니다1과 e2간의 모든 값, 이 두 값 포함하여 예를 들어

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //range() 메서드를 사용하여 EnumSet을 생성합니다
        EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE);
        System.out.println("EnumSet: ") + sizes);
    }
}

출력 결과

EnumSet: [MEDIUM, LARGE, EXTRALARGE]

4.of() 메서드를 사용하여

of() 메서드를 사용하여 지정된 요소를 포함하는 규범집합을 생성합니다. 예를 들어,

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //단일 파라미터를 가진 of()를 사용하여
        EnumSet<Size> sizes1 = EnumSet.of(Size.MEDIUM);
        System.out.println("EnumSet1: " + sizes1);
        EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE);
        System.out.println("EnumSet2: " + sizes2);
    }
}

출력 결과

EnumSet1: [MEDIUM]
EnumSet2: [SMALL, LARGE]

EnumSet 메서드

EnumSet 클래스는 규범집합에 대해 다양한 요소를 수행할 수 있는 메서드를 제공합니다.

요소를 규범집합에 삽입합니다

  • add() - 지정된 규범값을 규범집합에 삽입합니다

  • addAll() - 지정된 집합의 모든 요소를 집합에 삽입합니다

예를 들어,

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //allOf()를 사용하여 EnumSet을 생성합니다
        EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);
        //noneOf()를 사용하여 EnumSet을 생성합니다
        EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);
        //add() 메서드를 사용하여 요소를 추가합니다
        sizes2.add(Size.MEDIUM);
        System.out.println("EnumSet을 사용하여 add() 메서드: ") + sizes2);
        //addAll() 메서드를 사용하여
        sizes2.addAll(sizes1);
        System.out.println("EnumSet을 사용하여 addAll() 메서드: ") + sizes2);
    }
}

출력 결과

EnumSet을 사용하여 add() 메서드: [MEDIUM]
EnumSet을 사용하여 addAll() 메서드: [SMALL, MEDIUM, LARGE, EXTRALARGE]

위의 예제에서는 addAll() 메서드를 사용하여 sizes1규범집합의 모든 요소를 sizes에 삽입합니다2규범집합.

addAll()를 사용하여 다른 집합(예: ArrayList, LinkedList 등)의 요소를 규범집합에 삽입할 수도 있습니다. 하지만 모든 집합은 같은 규범형을 가지고 있어야 합니다.

규범집합 요소에 접근

규범집합의 요소에 접근하려면 iterator() 메서드를 사용할 수 있습니다. 이 메서드를 사용하려면 java.util.Iterator 패키지를 가져와야 합니다. 예를 들어,

import java.util.EnumSet;
import java.util.Iterator;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //allOf()를 사용하여 EnumSet을 생성합니다
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        Iterator<Size> iterate = sizes.iterator();
        System.out.print("EnumSet: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

출력 결과

EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,

주의 사항

  • hasNext() - 열거 집합에 다음 요소가 존재하면 true 반환

  • next()  - 열거 집합의 다음 요소 반환

EnumSet 요소 제거

  • remove() - 지정된 요소를 열거 집합에서 제거

  • removeAll() - 모든 요소를 열거 집합에서 제거

예를 들어,

import java.util.EnumSet;
class Main {
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRALARGE
    }
    public static void main(String[] args) {
        //allOf() 사용하여 EnumSet 생성
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        System.out.println("EnumSet: ") + sizes);
        // remove() 사용
        boolean value1 = sizes.remove(Size.MEDIUM);
        System.out.println("MEDIUM이 제거되었는가? ") + value1);
        // removeAll() 사용
        boolean value2 = sizes.removeAll(sizes);
        System.out.println("모든 요소가 제거되었는가? ") + value2);
    }
}

출력 결과

EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
MEDIUM이 제거되었는가? true
모든 요소가 제거되었는가? true

기타 메서드

메서드설명
copyOf()EnumSet 복제 생성
contains()EnumSet이 지정한 요소를 중에서 검색하고布尔 결과 반환
isEmpty()EnumSet이 비어 있는지 확인
size()EnumSet의 크기 반환
clear()EnumSet에서 모든 요소를 제거합니다

복제 가능하고 시리얼라이제이블 인터페이스

EnumSet 클래스는 Cloneable과 Serializable 인터페이스를 구현합니다.

클론 인터페이스(Cloneable)

EnumSet 클래스는 이 클래스 인스턴스의 복제본을 만들 수 있습니다.

시리얼라이제이블 인터페이스(Serializable)

Java 객체가 네트워크를 통해 전송될 때마다 객체를 비트나 바이트로 변환해야 합니다. 이는 Java 객체가 네트워크를 통해 전송될 수 없기 때문입니다.

Serializable 인터페이스는 클래스가 시리얼라이제이션될 수 있도록 허용합니다. 이는 Serializable이 구현한 클래스의 객체를 비트나 바이트로 변환할 수 있음을 의미합니다.

왜 EnumSet을 선택합니까?

열거형 집합은 HashSet, TreeSet와 같은 다른 Set 구현보다 열거 값 저장에 더 효율적입니다.

열거형 집합은 특정 열거형의 열거 값만을 저장합니다. 따라서 JVM은 이 집합의 모든 가능한 값을 알고 있습니다.

이것이 why EnumSet이 내부에서 비트 시퀀스로 구현된 이유입니다. 비트는 요소가 열거형 집합에 포함되었는지 지정합니다.

집합에 해당 요소가 존재하면 해당 비트를 열어둡니다.