본문 바로가기

JAVA

컬렉션 프레임워크(Collection Framework) (2) - Set & Queue

1. Set


앞서 우리는 순서가 중요한 데이터를 담을때 사용하는 List에대해 알아보았다. Set의 경우 순서에 상관없이 어떤 데이터가 존재하는지를 파악하기 위한 용도로 사용한다.

 

즉, 중복되는 데이터가 중복되는 것을 방지하고, 원하는 데이터가 포함되어 있는지를 판단하는 용도로 사용한다.

 

Set 인터페이스를 구현하는 클래스는 HashSet, TreeSet, LinkedHashSet 가 있다.

3개의 클래스중 별도의 정렬 작업이 없어 가장 성능이 좋은 HashSet을 사용해보자.

 

public class HashSetCheck {
    public static void main(String[] args) {
        String[] fruits = {"apple","banana","watermelon","pineapple","apple","orange","orange"};

        Set<String> hashSet = new HashSet<>();
		
        //중복제거를 위해 hashset에 추가
        for (String str : fruits){
            hashSet.add(str);
        }

        //HashSet 데이터를 꺼내오는 첫번째 방법
        for (String str : hashSet){
            System.out.println(str);
        }
        System.out.println("------------------------");
        
        //HashSet 데이터를 꺼내오는 두번째 방법
        Iterator<String> iterator = hashSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

 

실행 화면

fruits 배열에는 apple, banana, watermelon, pineapple, orange 가 중복되어 존재한다.

이를 HashSet에 담는다면 결과가 순서와 상관없이 중복이 제거된 상태로 들어간다.

 

또한 HashSet은 순서가 없기때문에 Iterator() 라는 메소드를 사용해서 Iterator 객체를 생성하여 데이터를 확인할 수 있다.

 

2. Queue


기존에 사용했던 배열과 리스트는 데이터를 순차적으로 담아두어 사용하였다. 

만약 배열과 리스트에 있는 데이터중 중간에 있는 데이터를 삭제하면 어떻게 되는가?

 

2021.12.27 - [자바] - 컬렉션 프레임워크(Collection Framework) (1) - 리스트(List)

 

컬렉션 프레임워크(Collection Framework) (1) - 리스트(List)

1. 컬렉션 프레임워크 (Collection Framework) 자바에서 List, Set, Queue 는 Collection 이라는 인터페이스를 구현하고 있다. Collection 인터페이스는 java.util 패키지에 선언 되어 있고, 여러개의 객체를 하나..

dev-cool.tistory.com

 

데이터는 삭제된 상태로 비어있는 공간이 메모리를 차지하게 된다.

이를 보완하기 위해 자바에서는 LinkedList 클래스를 제공한다.

 

LinkedList에 데이터를 담아둘 때 A는 뒤에 B가 있는것을 알고, B는 A가 앞에 C가 뒤에있는것을 안다.

하지만 A는 C가 어디있는지 전혀 상관하지 않는다. 즉 자신의 앞과 뒤에 어떤 데이터가 있는지를 확인하는 것이다.

 

이때, B를 제거하게 된다면 B의 앞에있는 A와 뒤에있는 C를 연결해주면 비어있는 공간없이 메모리를 보다 효율적으로 사용할 수 있는것이다.

만약 우리가 배열이나 리스트로 이를 구현하려하면 B를 지움과 동시에 B뒤에있는 모든 데이터들의 위치를 앞으로 당겨주어야 한다. 

LinkedList는 이러한 작업이 필요하지 않으므로 데이터가 많아진다면 효율적이라는 것을 알 수 있다.

 

public class LinkedListCheck {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();

        linkedList.add("a");
        System.out.println(linkedList);

        linkedList.addFirst("b");
        System.out.println(linkedList);

        linkedList.push("c");
        System.out.println(linkedList);

        linkedList.addLast("d");
        System.out.println(linkedList);
    }
}

 

실행 결과

LinkedList의 add() 메소드와, addLast() 메소드는 실행 결과를 보면 알 수 있듯이 데이터를 가장 마지막에 저장하고, addFirst() 메소드와 push() 메소드는 가장 앞에 데이터를 저장한다.

 

즉, LinkedList는 List도 가능하고, Queue도 가능한 Deque인 것이다.