Java/Java

Java 컬렉션 프레임워크 _ Set(HashSet)

검은고양이개발자 2023. 1. 14. 17:36
반응형

 

Collection에서 집합의 특성을 가지고 있는 Set은 무엇일까요?


 

Set은 수학에서 집합이라는 의미를 뜻합니다.

 

우리들이 수학에서 집합 단원을 배울 때 각 집합마다 각 요소들이 순차적으로 들어가는 게 아닌

마치 주머니에 있는 것 같은 모양을 많이 봤습니다.

 

여기에서 Set은  Collection 인터페이스의 상속을 받는 List와 차이가 나타납니다.

 

List는 주로 순차적인 배열적인 특징을 가지고 있었다면

Set은 무분별한 공간에 저장되는 요소들을 이용하는 특징을 가집니다.

 

따라서, 각 인덱스마다 정보가 저장되어 같은 값이 저장되더라도 구분되던 List와 다르게

Set은 중복저장을 허용하지 않으며 저장순서를 저장하지 않습니다.

 

이는, 위 그림과 같이 수학적인 집합으로 생각하면 어찌보면 너무나 당연한 특징입니다.

 

이러한 특징 때문에 Set은 List와 다른 리턴타입을 가진 , 다른 메서드들이 존재합니다.

 

  리턴타입 메서드 설명
List void add(int index,Object o) 인덱스에 객체를 추가
Set boolean add(Object o) 객체를 추가하고, true/false 를 반환한다.
List Object get(int index) 인덱스에 저장된 객체를 반환
Set boolean contains(Obejct o) 객체가 Set에 존재하는지에 따른  true/false를 반환한다

 

위에 표는 List와 Set의 메서드들 중 비교가능한 메서드를 따로 모은 표인데

List인 경우 객체를 추가하기 위해서는 add 메서드 안에 index 인자와 객체를 넣어야 하는 반면

Set은 객체만을 추가합니다. 

 

이는, Set이 순차적으로 저장되는 특징이기에 나타나는 거며

또한 Set add 메서드의 리턴타입이 boolean 이유도 여기서 나타나는데

객체를 추가할 때 정해진 위치에 그저 추가하는 것이 아닌, 중복된 객체가 존재하는지 확인을 하고

만약 존재하지 않는 다면 , true라면 객체를 추가하는 프로세스를 가지기 때문에 Set의 리턴타입은 boolean 이 되고

Set의 contains도 비슷한 이유로 boolean을 리턴타입으로 가집니다.

 

public class CordJgSet {
    public static void main(String[] args) {

        HashSet<Integer> hashSet = new HashSet<>(10);

        hashSet.add(10);

        System.out.println(hashSet.add(20));  --> true
        
        Iterator<Integer> iter = hashSet.iterator();
        while(iter.hasNext()){
            int num = iter.next();
            System.out.println(num);
        }
    }
}
//출력
true
20
10

 

위 코드를 보면 , 위에 설명한 것같이 hashSet.add(20)을 출력하니 true값이 출력되었다.(boolean타입이기에)

동시에 객체가 추가되어 

Iterator를 통해 hashSet의 객체들을 확인해 보면 10,20이 포함되어 있는 것을 알 수 있습니다.

반응형