Java

Java Collection Framework (1)

예요 2024. 6. 17. 21:00

Java Collection Framework (1)

  • 데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해놓은 것
  • 개발자가 인스턴스화하여 사용한다.

1. Iterable Interface

  • Collection Interface들의 가장 최상위 Interface

 

2. Collection Interface

  • List, Set, Queue에 상속을 하는 실질적인 최상위 컬렉션  타입
  • 업캐스팅으로 다양한 종류의 컬렉션 자료형을 받아 자료 삽입/삭제/탐색 기능을 할 수 있다.
Collection<Number> c1 = new ArrayList<>();
c1.add(1);

Collection<Number> c2 = new ArrayList<>();
c2.add(2);
c1.addAll(c2);

Collection<Number> c3 = new ArrayList<>();
c3.add(3);

System.out.println(c1);
System.out.println(c2);
System.out.println(c3);

 

3. List Interface

  • 저장 순서가 유지된다.
  • 중복 요소 존재가 가능하다.
  • index로 요소에 접근한다.
  • 크기가 동적으로 변화한다.
  • 요소 사이에 빈 공간을 허용하지 않아 삽입/삭제 시 배열 이동이 일어난다.

① ArrayList Class

  • 단방향 포인터 구조로 자료에 대해 순차적인 접근이 가능하여 조회가 빠르다.
  • 삽입/삭제가 느리지만 순차적인 삽입/삭제의 경우에는 가장 빠르다. 
List<String> arrayList = new ArrayList<>();

arrayList.add("Hello");
arrayList.add("World");

System.out.println(arrayList);
System.out.println(arrayList.get(0));

arrayList.set(0, "Hello~");

System.out.println(arrayList);

 

② LinkedList Class

  • 노드(객체)를 연결하여 리스트처럼 만든 컬렉션
  • 데이터 중간 삽입/삭제가 빈번할 경우 빠른 성능을 보인다.
  • 임의의 요소에 대한 접근 성능은 좋지 않다.
  • 양방향 포인터 구조이다.
  • 리스트, 스택, 큐, 트리 등 자료구조의 근간이 된다.
List<String> linkedList = new LinkedList<>();

linkedList.add("Hello");
linkedList.add("World");

System.out.println(linkedList);
System.out.println(linkedList.get(0));

linkedList.set(0, "Hello~");

System.out.println(linkedList);

 

③ Vector Class

  • ArrayList의 구형 버전으로 잘 쓰이지 않는다.

④ Stack Class

  • 후입선출(LIFO) 구조
  • Vector Class를 상속하므로 잘 안쓰이며 대신 ArrayDeque Class를 사용한다.

 

4. Queue Interface

  • 선입선출(FIFO) 구조

① PriorityQueue Class

  • 우선 순위 큐
  • 원소에 우선 순위를 부여하여 우선 순위가 높은 순으로 정렬되고 꺼낸다.
  • 여러 개의 작업과 시간 제한이 있을 경우 우선 순위대로 수행할 때 쓰인다.
    ex. 네트워크 제어, 작업 스케줄링
  • 저장 객체는 필수적으로 Comparable Interface로 구현해야하는데 compareTo() 메소드 로직에 따라 객체의 우선 순위를 결정하는 식으로 동작되기 때문이다.
  • 저장 공간으로 배열을 사용하며, 각 요소를 힙 형태로 저장한다.
  • null 저장이 불가능하다.
public class User implements Comparable<User> {

    String name;
    int priority;

    public User(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    @Override
    public int compareTo(User student) {

        if (this.priority < student.priority) {
            return -1;
        } else if (this.priority == student.priority) {
            return 0;
        } else {
            return 1;
        }

    }

    @Override
    public String toString() {

        return "User name : " + name + " priority : " + priority;

    }

}

 

Queue<User> priorityQueue = new PriorityQueue<>();

priorityQueue.add(new User("박정민", 1));
priorityQueue.add(new User("고윤정", 5));
priorityQueue.add(new User("이동욱", 2));

System.out.println(priorityQueue);

System.out.println(priorityQueue.peek());

System.out.println(priorityQueue.poll());
System.out.println(priorityQueue.poll());
System.out.println(priorityQueue.poll());
System.out.println(priorityQueue.poll());

 

4. Deque(Double-Ended Queue) Interface

  • 양쪽으로 넣고 빼는 것이 가능한 큐
  • 스택과 큐를 하나로 합쳐놓은 것이다.

① ArrayDeque Class

  • 크기에 제한이 없다.
  • null 저장이 불가능하다.
Deque<Integer> deque = new ArrayDeque<>();

deque.offerFirst(1);
deque.offerFirst(5);
deque.offerLast(10);
deque.offerLast(2);

System.out.println(deque);

deque.pollFirst();
deque.pollLast();

System.out.println(deque);

 

② LinkedList Class

  • List Interface와 Queue Interface를 동시에 상속받고 있으므로 스택/큐 로서 응용이 가능하다.
  • 큐 동작과 관련된 메소드를 지원한다.
Queue<String> linkedListQueue = new LinkedList<>();

linkedListQueue.offer("Hello");
linkedListQueue.offer("World");

System.out.println(linkedListQueue);

linkedListQueue.poll();

System.out.println(linkedListQueue);

 

▷ 출처

728x90