경계의 경계

자바의 Collection Framework 본문

Java

자바의 Collection Framework

gigyesik 2024. 2. 20. 03:41

Collection Framework 란 무엇인가

자바의 Collection Framework 란 여러 객체를 구조화하여 제공하는 프레임워크를 의미한다.

자바 컬렉션은 데이터 검색, 정렬, 삽입, 조작, 삭제 등을 수행할 수 있는 기능을 제공한다.

  • 컬렉션 (Collection) 은 객체의 모음이다.
  • 프레임워크 (Framework) 는 미리 만들어진 코드 아키텍쳐로, 클래스들과 인터페이스들을 포함한다.

Collection Framwork 의 계층

  • Collection 클래스는 Iterable 클래스를 상속한다.
  • java.util 패키지에 Collection Framework 의 모든 클래스와 인터페이스가 포함되어 있다.
  • 하위에는 List, Queue, Set 인터페이스가 있다.
  • 각 인터페이스 하위에 ArrayList, PriorityQueue, HashSet 등 대표적 자료구조의 구현 클래스들이 존재한다.

Collection 인터페이스의 대표적 메서드들

  • add(), addAll() : collection 에 요소를 추가한다.
  • remove(), removeAll(), removeIf() : collection 의 요소를 제거한다.
  • retainAll() : 특정 요소를 제외한 모든 요소를 제거한다.
  • size() : collection 의 크기를 반환한다.
  • clear() : collection 을 비운다.
  • contains(), containAll() : 특정 요소의 포함 여부를 반환한다.
  • iterator() : iterator 를 반환한다.
  • toArray() : collection 을 배열로 변환하여 반환한다.
  • isEmpty() : collection 이 비어있는지 여부를 반환한다.

Collection 인터페이스의 구현체들

List 인터페이스

데이터를 순서대로 저장하며, 같은 데이터가 여러개 존재할 수 있는 자료구조

List<String> stringList = new ArrayList<>();
List<Long> longList = new LinkedList<>();
List<Integer> integerList = new Vector<>();
List<Float> floatList = new Stack<>();

ArrayList 인터페이스

데이터를 여러개 저장하지만, 순서는 요소를 넣은 대로 정해지며 바뀌지 않는 자료구조

ArrayList<Integer> integerArrayList = new ArrayList<>();
integerArrayList.add(1);
integerArrayList.add(2);
integerArrayList.add(3);
integerArrayList.add(4);

Iterator<Integer> iterator = integerArrayList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); // 1 2 3 4
}

LinkedList 인터페이스

ArrayList와 비슷하지만, 데이터 shifting 이 필요없어 수정이 빠르다는 특징이 있는 자료구조

LinkedList<Long> longLinkedList = new LinkedList<>();
longLinkedList.add(1L);
longLinkedList.add(2L);
longLinkedList.add(3L);
longLinkedList.add(4L);

Iterator<Long> iterator = longLinkedList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); // 1 2 3 4
}

Vector

ArrayList와 비슷하지만, Collection Framework 에 포함되지 않은 메서드들을 더 제공하는 자료구조

Vector<String > stringVector = new Vector<>();
stringVector.add("a");
stringVector.add("b");
stringVector.add("c");
stringVector.add("d");

Iterator<String> iterator = stringVector.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); // a b c d
}

Stack

Vector 의 서브클래스로, LIFO (Last In First Out) 구조

Stack<String> stringStack = new Stack<>();
stringStack.push("a");
stringStack.push("b");
stringStack.push("c");
stringStack.push("d");
stringStack.push("e");
stringStack.pop();

Iterator<String> iterator = stringStack.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); // a b c d
}

Queue 인터페이스

FIFO (First In First Out) 형태의 자료구조.

Queue<String> q1 = new PriorityQueue<>();
Queue<Integer> q2 = new ArrayDeque<>();

PriorityQueue

우선순위 큐. 설정한 우선순위에 따라 출력 순서가 정해지는 큐

PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
System.out.println("head: " + queue.element()); // 1
System.out.println("head: " + queue.peek()); // 1

Iterator<Integer> iterator = queue.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next()); // 1 2 3 4
}

queue.remove();
queue.poll();

Iterator<Integer> iterator2 = queue.iterator();
while (iterator2.hasNext()) {
    System.out.println(iterator2.next()); // 3 4
}

Dequeue 인터페이스

큐 인터페이스의 상속 구현체로, 동일하게 FIFO 원칙을 따르나 삽입과 삭제를 양방향에서 할 수 있는 차이가 있다.

Deque<String> deque = new ArrayDeque<>();

ArrayDeque

dequeue 구현체. arrayList, stack 보다 빠른 성능을 가지고 있다.

Deque<String> deque = new ArrayDeque<>();

deque.add("a");
deque.add("b");
deque.add("c");

for (String s : deque) {
    System.out.println(s); // a b c
}

Set 인터페이스

집합 (Set) 은 java.util 하위 인터페이스이다. 가장 큰 특징은 다른 자료구조와는 달리 중복 되는 값을 허용하지 않는다는 것이다.

Set<String> s1 = new HashSet<>();
Set<Integer> s2 = new LinkedHashSet<>();
Set<Long> s3 = new TreeSet<>();

HashSet

Set 인터페이스 구현체. 데이터의 중복을 hash table을 통해 판단한다.

HashSet<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");

Iterator<String> iterator = set.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next()); // a b c d
}

LinkedHashSet

Set, HashSet 상속 구현체. 이름에서 알 수 있듯 역시 중복값 비허용이고, 입력 순서대로의 순서를 보장하며, null 값을 허용한다.

LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");

Iterator<String> iterator = set.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next()); // a b c d
}

SortedSet 인터페이스

순서를 보장하는 Set. 크기 순서대로 정렬된다.

SortedSet<String> set = new TreeSet<>();

TreeSet

SortedSet 구현체. 크기순으로 정렬되어 있는 데이터에 접근할 때 빠른 접근속도를 자랑한다.

TreeSet<String> set = new TreeSet<>();
set.add("b");
set.add("a");
set.add("d");
set.add("c");

Iterator<String> iterator = set.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next()); // a b c d
}

Resources

'Java' 카테고리의 다른 글

자바의 네트워킹과 소켓 통신  (1) 2024.02.27
자바의 직렬화 (Serialization)  (0) 2024.02.22
자바의 메모리 관리  (1) 2024.02.13
자바의 HTTP 통신 라이브러리  (0) 2024.02.09
자바의 파일 입출력  (0) 2024.02.09