Set은 우리말로 '집합'입니다.

A = {a, b, c} , B = {a, b}... 이런게 집합이죠?

중학생때 배웠던 기억을 꺼내보면... 잘 기억이 나지 않을 수도 있지만...

집합은 똑같은 값 즉, 중복된 값을 가지지는 않습니다.

또한 순서는 상관이 없죠.

A = {a, b, c} 이 집합 A를 A={c, a, b} 라고 써도 같다는 거죠.


1. 중복된 값은 저장하지 않는다.

2. 저장 순서는 상관이 없다.


이 두가지 특징이 Set의 특징이 됩니다. 

잠깐 중복된 값이 저장되지 않는다라는 특징이 맞는지 확인해 보겠습니다.


1, 2, 3, 1, 1을 추가하였는데 출력은 1, 2, 3 만 출력 됨을 확인 할 수 있습니다.



이제는 Set인터페이스를 구현한 대표적인 HashSet을 알아보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.HashSet;
 
public class SetDemo {
    public static void main(String[] args){
        HashSet<Integer> hs = new HashSet<Integer>();
        hs.add(1);
        hs.add(2);
        hs.add(3);
        hs.add(4);
        hs.add(5);
        
        HashSet<Integer> hs2 = new HashSet<Integer>();
        hs2.add(3);
        hs2.add(4);
        hs2.add(5);
    }
}
cs

hs1이라는 HashSet과 hs2라는 HashSet을 만들었습니다.

이것을 그림으로 표현해 보면 다음과 같이 표현할 수 있습니다.




두개의 집합이 생긴거죠~

이 두개의 집합을 가지고 합집합, 교집합, 차집합, 부분집합을 구해보도록 하겠습니다.


먼저 부분집합을 알아보려고 하는데요

집합hs2는 hs의 부분집합입니다.

이것이 맞는지 틀린지 알아보기 위해서는 containsAll()을 사용하면 알 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.HashSet;
 
public class SetDemo {
    public static void main(String[] args){
        HashSet<Integer> hs = new HashSet<Integer>();
        hs.add(1);
        hs.add(2);
        hs.add(3);
        hs.add(4);
        hs.add(5);
        
        HashSet<Integer> hs2 = new HashSet<Integer>();
        hs2.add(3);
        hs2.add(4);
        hs2.add(5);
        
        System.out.println(hs.containsAll(hs2));
        
    }
}
cs

17번라인처럼 containsAll()을 사용해서 출력을 해보면 true, false로 리턴 해줍니다.

지금의 경우는 hs2가 hs의 부분집합을 만족하므로 true를 출력합니다.


이번엔 합집합을 구해보겠습니다.

합집합을 구하기 위해서는 addAll()이라는 메소드를 사용하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.HashSet;

 
public class SetDemo {
    public static void main(String[] args){
        HashSet<Integer> hs = new HashSet<Integer>();
        hs.add(1);
        hs.add(2);
        hs.add(3);
        hs.add(4);
        hs.add(5);
        
        HashSet<Integer> hs2 = new HashSet<Integer>();
        hs2.add(3);
        hs2.add(4);
        hs2.add(5);
        hs2.add(6);
        hs2.add(7);
        
        hs.addAll(hs2);
        
        System.out.println(hs.toString());
    }
}
cs

hs2에 6과 7을 추가했습니다.

그리고 addAll()을 이용해서 집합hs에 합하였습니다.




이런 모습이 된겁니다.


이번엔 차집합을 구해보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.HashSet;

 
public class SetDemo {
    public static void main(String[] args){
        HashSet<Integer> hs = new HashSet<Integer>();
        hs.add(1);
        hs.add(2);
        hs.add(3);
        hs.add(4);
        hs.add(5);
        
        HashSet<Integer> hs2 = new HashSet<Integer>();
        hs2.add(3);
        hs2.add(4);
        hs2.add(5);
        hs2.add(6);
        hs2.add(7);
        
        hs.removeAll(hs2);
 
        System.out.println(hs.toString());
    }
}
cs

20번 라인처럼 removeAll()이라는 메소드를 사용해서 집합hs와 집합hs2에서 집합hs의 값들 중 에서 집합hs2에도 있는 값을 뺸 값들이 나옵니다.





마지막으로 교집합입니다.

두 집합 중 공통된 값을 뽑아내는 것이죠.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.HashSet;

 
public class SetDemo {
    public static void main(String[] args){
        HashSet<Integer> hs = new HashSet<Integer>();
        hs.add(1);
        hs.add(2);
        hs.add(3);
        hs.add(4);
        hs.add(5);
        
        HashSet<Integer> hs2 = new HashSet<Integer>();
        hs2.add(3);
        hs2.add(4);
        hs2.add(5);
        hs2.add(6);
        hs2.add(7);
        
        hs.retainAll(hs2);
 
        System.out.println(hs.toString());
    }
}
cs

20번라인처럼 retainAll()이라는 메소드를 사용하였습니다.




지금까지 사용된 contatinsAll(), addAll(), removeAll(), retainAll() 메소드는 List에서도 사용이 가능합니다.

왜냐하면~ 맨 위의 Collection 클래스 다이어 그램을 보면 Collection인터페이스에 정의되어 있기 때문입니다~!!