Java 에서 다른 세트의 모든 요소를 세트가 포함하는지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 한 세트가 다른 세트의 모든 요소를 포함하는지 확인하는 방법을 배우게 됩니다. 이 부분 집합 검사를 수행하는 편리한 방법인 containsAll() 메서드를 살펴보겠습니다.

실습 예제를 통해 다양한 세트 유형에서 containsAll()을 사용하는 방법과 빈 세트 및 null 세트와 같은 예외 케이스를 처리하는 방법을 배우게 됩니다.

containsAll() 을 사용한 부분 집합 확인

이 단계에서는 Java 에서 containsAll() 메서드를 사용하여 한 세트가 다른 세트의 부분 집합인지 확인하는 방법을 살펴보겠습니다. 이는 컬렉션 작업 시 일반적인 작업이며, containsAll()은 이 검사를 수행하는 편리한 방법을 제공합니다.

먼저, ~/project 디렉토리에 SubsetCheck.java라는 새 Java 파일을 생성해 보겠습니다. 왼쪽의 파일 탐색기에서 마우스 오른쪽 버튼을 클릭하고 "새 파일"을 선택한 다음 SubsetCheck.java를 입력하여 이 작업을 수행할 수 있습니다.

이제 편집기에서 SubsetCheck.java 파일을 열고 다음 코드를 추가합니다.

import java.util.HashSet;
import java.util.Set;

public class SubsetCheck {

    public static void main(String[] args) {
        // Create the main set
        Set<Integer> mainSet = new HashSet<>();
        mainSet.add(1);
        mainSet.add(2);
        mainSet.add(3);
        mainSet.add(4);
        mainSet.add(5);

        // Create a potential subset
        Set<Integer> subset = new HashSet<>();
        subset.add(2);
        subset.add(4);

        // Check if 'subset' is a subset of 'mainSet'
        boolean isSubset = mainSet.containsAll(subset);

        // Print the result
        System.out.println("Main Set: " + mainSet);
        System.out.println("Subset: " + subset);
        System.out.println("Is 'subset' a subset of 'mainSet'? " + isSubset);
    }
}

코드를 분석해 보겠습니다.

  • import java.util.HashSet;import java.util.Set;: 이 줄은 세트 작업에 필요한 클래스를 가져옵니다.
  • Set<Integer> mainSet = new HashSet<>();: 이는 정수 값을 저장할 mainSet이라는 HashSet을 생성합니다.
  • mainSet.add(...): 이 줄은 mainSet에 요소를 추가합니다.
  • Set<Integer> subset = new HashSet<>();: 이는 subset이라는 다른 HashSet을 생성합니다.
  • subset.add(...): 이 줄은 subset에 요소를 추가합니다.
  • boolean isSubset = mainSet.containsAll(subset);: 이는 이 단계의 핵심입니다. mainSetcontainsAll() 메서드가 인수로 subset을 사용하여 호출됩니다. mainSetsubset의 모든 요소를 포함하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
  • System.out.println(...): 이 줄은 세트와 부분 집합 검사 결과를 콘솔에 출력합니다.

SubsetCheck.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

이제 WebIDE 하단의 터미널을 엽니다. ~/project 디렉토리에 있는지 확인합니다. 그렇지 않은 경우 cd ~/project 명령을 사용합니다.

javac 명령을 사용하여 Java 코드를 컴파일합니다.

javac SubsetCheck.java

오류가 없으면 출력이 표시되지 않습니다. 이는 컴파일이 성공적으로 완료되었고 SubsetCheck.class 파일이 생성되었음을 의미합니다.

마지막으로, java 명령을 사용하여 컴파일된 Java 프로그램을 실행합니다.

java SubsetCheck

다음과 유사한 출력을 볼 수 있습니다.

Main Set: [1, 2, 3, 4, 5]
Subset: [2, 4]
Is 'subset' a subset of 'mainSet'? true

이 출력은 containsAll() 메서드가 subset이 실제로 mainSet의 부분 집합임을 올바르게 식별했음을 확인합니다.

다양한 Set 유형으로 테스트

이전 단계에서는 containsAll() 메서드를 시연하기 위해 HashSet을 사용했습니다. Java 는 HashSet, LinkedHashSet, TreeSet과 같은 Set 인터페이스의 다양한 구현을 제공합니다. 내부 구조와 속성 (예: 순서) 이 다르지만 containsAll() 메서드는 모든 구현에서 일관되게 작동합니다.

이 단계에서는 SubsetCheck.java 파일을 수정하여 다양한 유형의 세트로 containsAll()을 테스트합니다.

WebIDE 편집기에서 SubsetCheck.java 파일을 엽니다.

기존 코드를 다음으로 바꿉니다.

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class SubsetCheck {

    public static void main(String[] args) {
        // Create a main set using HashSet
        Set<Integer> hashMainSet = new HashSet<>();
        hashMainSet.add(10);
        hashMainSet.add(20);
        hashMainSet.add(30);
        hashMainSet.add(40);

        // Create a subset using LinkedHashSet
        Set<Integer> linkedSubset = new LinkedHashSet<>();
        linkedSubset.add(30);
        linkedSubset.add(10);

        // Create another subset using TreeSet
        Set<Integer> treeSubset = new TreeSet<>();
        treeSubset.add(40);
        treeSubset.add(20);

        // Check subset relationship using containsAll()
        boolean isLinkedSubset = hashMainSet.containsAll(linkedSubset);
        boolean isTreeSubset = hashMainSet.containsAll(treeSubset);

        // Create a subset that is NOT a subset
        Set<Integer> notSubset = new HashSet<>();
        notSubset.add(20);
        notSubset.add(50); // 50 is not in hashMainSet

        boolean isNotSubset = hashMainSet.containsAll(notSubset);


        // Print the results
        System.out.println("Hash Main Set: " + hashMainSet);
        System.out.println("Linked Subset: " + linkedSubset);
        System.out.println("Is Linked Subset a subset of Hash Main Set? " + isLinkedSubset);
        System.out.println("Tree Subset: " + treeSubset);
        System.out.println("Is Tree Subset a subset of Hash Main Set? " + isTreeSubset);
        System.out.println("Not Subset: " + notSubset);
        System.out.println("Is Not Subset a subset of Hash Main Set? " + isNotSubset);
    }
}

이 업데이트된 코드에서:

  • LinkedHashSetTreeSet을 가져왔습니다.
  • HashSet을 사용하여 hashMainSet을 생성했습니다.
  • LinkedHashSet을 사용하여 linkedSubset을 생성하고 TreeSet을 사용하여 treeSubset을 생성했습니다. linkedSubset에 추가된 요소의 순서가 hashMainSet에 나타나는 방식과 다르지만 containsAll()은 여전히 ​​올바르게 작동합니다. TreeSet은 자동으로 요소를 정렬합니다.
  • 또한 containsAll()false를 반환하는 경우를 시연하기 위해 notSubset을 추가했습니다.

SubsetCheck.java 파일을 저장합니다.

이제 터미널에서 수정된 코드를 컴파일합니다.

javac SubsetCheck.java

컴파일이 성공하면 프로그램을 실행합니다.

java SubsetCheck

다음과 유사한 출력을 볼 수 있습니다.

Hash Main Set: [40, 10, 20, 30]
Linked Subset: [30, 10]
Is Linked Subset a subset of Hash Main Set? true
Tree Subset: [20, 40]
Is Tree Subset a subset of Hash Main Set? true
Not Subset: [50, 20]
Is Not Subset a subset of Hash Main Set? false

이는 containsAll()이 부분 집합에 사용된 특정 Set 구현에 관계없이, 메인 세트가 부분 집합의 모든 요소를 포함하는 한 올바르게 작동함을 보여줍니다.

빈 Set 및 Null Set 처리

이 마지막 단계에서는 containsAll() 메서드가 빈 세트와 null 값을 처리할 때 어떻게 동작하는지 살펴보겠습니다. 이러한 예외적인 경우를 이해하는 것은 견고한 코드를 작성하는 데 중요합니다.

WebIDE 편집기에서 SubsetCheck.java 파일을 엽니다.

기존 코드를 다음으로 바꿉니다.

import java.util.HashSet;
import java.util.Set;

public class SubsetCheck {

    public static void main(String[] args) {
        Set<Integer> mainSet = new HashSet<>();
        mainSet.add(1);
        mainSet.add(2);
        mainSet.add(3);

        // Case 1: Checking with an empty set
        Set<Integer> emptySet = new HashSet<>();
        boolean isEmptySubset = mainSet.containsAll(emptySet);
        System.out.println("Main Set: " + mainSet);
        System.out.println("Empty Set: " + emptySet);
        System.out.println("Is Empty Set a subset of Main Set? " + isEmptySubset);

        System.out.println("---"); // Separator

        // Case 2: Checking if an empty set contains all elements of a non-empty set
        Set<Integer> anotherEmptySet = new HashSet<>();
        Set<Integer> nonEmptySet = new HashSet<>();
        nonEmptySet.add(1);
        boolean isEmptyContainingNonEmpty = anotherEmptySet.containsAll(nonEmptySet);
        System.out.println("Another Empty Set: " + anotherEmptySet);
        System.out.println("Non-Empty Set: " + nonEmptySet);
        System.out.println("Is Another Empty Set a subset of Non-Empty Set? " + isEmptyContainingNonEmpty);

        System.out.println("---"); // Separator

        // Case 3: Checking with a null set
        Set<Integer> nullSet = null;
        try {
            boolean isNullSubset = mainSet.containsAll(nullSet);
            System.out.println("Is Null Set a subset of Main Set? " + isNullSubset);
        } catch (NullPointerException e) {
            System.out.println("Checking with a null set resulted in a: " + e.getClass().getName());
        }
    }
}

새로운 부분을 살펴보겠습니다.

  • Case 1: 빈 세트로 확인: emptySet을 생성하고 mainSet이 모든 요소를 포함하는지 확인합니다. 빈 세트는 다른 빈 세트를 포함하여 모든 세트의 부분 집합으로 간주됩니다.
  • Case 2: 빈 세트가 비어 있지 않은 세트의 모든 요소를 포함하는지 확인: anotherEmptySetnonEmptySet의 모든 요소를 포함하는지 확인합니다. 빈 세트에는 요소 1이 없으므로 이는 false 여야 합니다.
  • Case 3: null 세트로 확인: Set 변수를 null로 설정합니다. null 인수로 containsAll()을 호출하려고 하면 NullPointerException이 발생합니다. try-catch 블록을 사용하여 이 예상된 예외를 적절하게 처리하고 메시지를 출력합니다.

SubsetCheck.java 파일을 저장합니다.

터미널에서 코드를 컴파일합니다.

javac SubsetCheck.java

컴파일된 프로그램을 실행합니다.

java SubsetCheck

다음과 유사한 출력을 볼 수 있습니다.

Main Set: [1, 2, 3]
Empty Set: []
Is Empty Set a subset of Main Set? true
---
Another Empty Set: []
Non-Empty Set: [1]
Is Another Empty Set a subset of Non-Empty Set? false
---
Checking with a null set resulted in a: java.lang.NullPointerException

이 출력은 빈 세트 및 null 세트와 함께 containsAll()의 동작을 확인합니다.

  • 빈 세트는 항상 다른 세트의 부분 집합입니다 (true).
  • 비어 있지 않은 세트는 빈 세트의 부분 집합이 아닙니다 (false).
  • nullcontainsAll()에 전달하면 NullPointerException이 발생합니다.

이러한 경우를 이해하면 Java 에서 세트로 작업할 때 잠재적인 오류를 방지하는 데 도움이 됩니다.

요약

이 Lab 에서 우리는 Java 에서 containsAll() 메서드를 사용하여 한 세트가 다른 세트의 모든 요소를 포함하는지 확인하는 방법을 배웠습니다. containsAll()의 핵심 기능을 시연하기 위해 HashSet을 사용하는 기본적인 예제로 시작했습니다. 이 메서드는 잠재적인 부분 집합이 실제로 더 큰 세트에 포함되어 있는지 확인하는 간단한 방법을 제공합니다.

그런 다음 다양한 유형의 세트로 이 기능을 테스트하는 방법을 탐구하여 containsAll()이 다양한 Set 구현에서 일관되게 작동한다는 것을 이해했습니다. 마지막으로, 부분 집합 검사를 수행할 때 빈 세트와 null 세트를 처리하는 중요한 고려 사항을 다루어 견고하고 오류 없는 코드를 보장했습니다.