본문 바로가기
Java/컬렉션 프레임워크(Collection Framework)

4. Set <E>

by mozzi329 2022. 7. 14.
728x90
 

 

     

    집합(Set)

     

    📌 Set <E>

    Set은 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는 컬렉션이다.

    대표적으로 Set을 구현할 클래스에는 HashSet, TreeSet이 있다.

     

    ✔️ Set의 메서드

    기능 리턴 타입 메서드 설명
    객체 추가 boolean add(Object o) 주어진 객체를 추가하고, 성공하면 true를, 중복 객체면 false를 반환합니다.
    객체 검색 boolean contains(Object o) 주어진 객체가 Set에 존재하는지 확인합니다.
      boolean isEmpty() Set이 비어있는지 확인합니다.
      Iterator Iterator() 저장된 객체를 하나씩 읽어오는 반복자를 리턴합니다.
      int size() 저장되어 있는 전체 객체의 수를 리턴합니다.
    객체 삭제 void clear() Set에 저장되어져 있는 모든 객체를 삭제합니다.
      boolean remove(Object o) 주어진 객체를 삭제합니다.

     

    📌 HashSet

    HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스이다.

    따라서 Set 인터페이스의 특성을 그대로 물려받으므로 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다.

    HashSet에 값을 추가할 때

    1. add(Object o)를 통해 객체를 저장하고자 한다.
    2. 이 때, 저장하고자 하는 객체의 해시코드를 hashCode() 메서드를 통해 얻어낸다.
    3. Set이 저장하고 있는 모든 객체들의 해시코드를 hashCode() 메서드로 얻어낸다.
    4. 저장하고자 하는 객체의 해시코드와, Set에 이미 저장되어져 있던 객체들의 해시코드를 비교하여, 같은 해시코드가 있는지 검사한다.
      • 이 때, 만약 같은 해시코드를 가진 객체가 존재한다면 저장하고자 했던 객체가 중복 객체로 간주되어 Set에 추가되지 않으며, add(Object o) 메서드가 false를 리턴한다.
      • 같은 해시코드를 가진 객체가 존재하지 않는다면, Set에 객체가 추가되며 add(Object o) 메서드가 true를 리턴한다.
    5. equals() 메서드를 통해 객체를 비교한다.
      • true가 리턴된다면 중복 객체로 간주되어 Set에 추가되지 않으며, add(Object o)가 false를 리턴한다.
      • false가 리턴된다면 Set에 객체가 추가되며, add(Object o) 메서드가 true를 리턴한다.

     

    📌 TreeSet

    TreeSet은 이진 탐색 트리 형태로 데이터를 저장한다.

    데이터의 중복 저장을 허용하지 않고 저장 순서를 유지하지 않는 Set 인터페이스의 특징은 그대로 유지된다.

     

    이진 탐색 트리(Binary Search Tree)란 하나의 부모 노드가 최대 두 개의 자식 노드와 연결되는 이진 트리(Binary Tree)의 일종으로, 정렬과 검색에 특화된 자료 구조이다.

    이진 탐색 트리(Binary Search Tree)

    최상위 노드를 ‘루트'라고 한다. 위의 그림에서 10이 바로 루트 노드에 해당된다.

     

    이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있다.

    class Node {
    	Object element; // 객체의 주소값을 저장하는 참조변수다.
    	Node left;      // 왼쪽 자식 노드의 주소값을 저장하는 참조변수다.
    	Node right;     // 오른쪽 자식 노드의 주소값을 저장하는 참조변수다.
    }
    

     

    아래 예시를 살펴보자.

    import java.util.TreeSet;
    
    public class TreeSetExample {
        public static void main(String[] args) {
    
    				// TreeSet 생성
            TreeSet<String> workers = new TreeSet<>();
    
    				// TreeSet에 요소 추가
            workers.add("Lee Java");
            workers.add("Park Hacker");
            workers.add("Kim Coding");
    
            System.out.println(workers);
            System.out.println(workers.first());
            System.out.println(workers.last());
            System.out.println(workers.higher("Lee"));
            System.out.println(workers.subSet("Kim", "Park"));
        }
    }
    

    출력값을 확인해보면, 요소를 추가하기만 했음에도 불구하고, 자동으로 사전 편찬 순에 따라 오름차순으로 정렬된 것을 확인할 수 있다. 이는 TreeSet의 기본 정렬 방식이 오름차순이기 때문이다.

    댓글