컬렉션 프레임워크의 개념

Yanagi·2021년 8월 22일
0

1. 컬렉션 프레임워크(collection framework)란?

  • 자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다.
  • 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다.

2.컬렉션 프레임워크 주요 인터페이스

  • 컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 핵심이 되는 주요 인터페이스를 정의하고 있습니다.
  1. List 인터페이스 & 2. Set 인터페이스
  2. Map 인터페이스
  • 이 중에서 List와 Set 인터페이스는 모두 Collection 인터페이스를 상속받지만, 구조상의 차이로 인해 Map 인터페이스는 별도로 정의됩니다.
  • 따라서 List 인터페이스와 Set 인터페이스의 공통된 부분을 Collection 인터페이스에서 정의하고 있습니다.
  • 그림에서 나 <K, V>라는 것은 컬렉션 프레임워크를 구성하는 모든 클래스가 제네릭으로 표현되어 있음을 알려줍니다.

3.주요 인터페이스의 간략한 특징

  1. List
    순서가 있는 데이터 의 집합으로, 데이터의 중복을 허용함.

    Vector, ArrayList, LinkedList, Stack, Queue

  2. Set
    순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않음.

    HashSet, TreeSet

  3. Map<K, V>
    키와 값의 한 쌍으로 이루어지는 데이터의 집합으로, 순서가 없음.
    이때 키는 중복을 허용하지 않지만, 값은 중복될 수 있음.

    HashMap, TreeMap, Hashtable, Properties

4.컬렉션 클래스(collection class)

  • 컬렉션 프레임워크에 속하는 인터페이스를 구현한 클래스를 컬렉션 클래스(collection class)라고 합니다.
  • 컬렉션 프레임워크의 모든 컬렉션 클래스는 List와 Set, Map 인터페이스 중 하나의 인터페이스를 구현하고 있습니다.
  • 또한, 클래스 이름에도 구현한 인터페이스의 이름이 포함되므로 바로 구분할 수 있습니다.
  • Vector나 Hashtable과 같은 컬렉션 클래스는 예전부터 사용해 왔으므로, 기존 코드와의 호환을 위해 아직도 남아 있습니다.
  • 하지만 기존에 사용하던 컬렉션 클래스를 사용하는 것보다는 새로 추가된 ArrayList나 HashMap 클래스를 사용하는 것이 성능 면에서도 더 나은 결과를 얻을 수 있습니다.

5. Collection 인터페이스

  • List와 Set 인터페이스의 많은 공통된 부분을 Collection 인터페이스에서 정의하고, 두 인터페이스는 그것을 상속받습니다.
  • 따라서 Collection 인터페이스는 컬렉션을 다루는데 가장 기본적인 동작들을 정의하고, 그것을 메소드로 제공하고 있습니다.
  1. boolean add(E e)
    해당 컬렉션(collection)에 전달된 요소를 추가함. (선택적 기능)
  2. void clear()
    해당 컬렉션의 모든 요소를 제거함. (선택적 기능)
  3. boolean contains(Object o)
    해당 컬렉션이 전달된 객체를 포함하고 있는지를 확인함.
  4. boolean equals(Object o)
    해당 컬렉션과 전달된 객체가 같은지를 확인함.
  5. boolean isEmpty()
    해당 컬렉션이 비어있는지를 확인함.
  6. Iterator iterator()
    해당 컬렉션의 반복자(iterator)를 반환함.
  7. boolean remove(Object o)
    해당 컬렉션에서 전달된 객체를 제거함. (선택적 기능)
  8. int size()
    해당 컬렉션의 요소의 총 개수를 반환함.
  9. Object[] toArray()
    해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환함.

6. 스택(Stack)

Stack 클래스

  • Stack 클래스는 List 컬렉션 클래스의 Vector 클래스를 상속받아, 전형적인 스택 메모리 구조의 클래스를 제공합니다.
  • 스택 메모리 구조는 선형 메모리 공간에 데이터를 저장하면서 후입선출(LIFO)의 시멘틱을 따르는 자료 구조입니다.
  • 즉, 가장 나중에 저장된(push) 데이터가 가장 먼저 인출(pop)되는 구조입니다.

Stack 클래스는 스택 메모리 구조를 표현하기 위해, Vector 클래스의 메소드를 5개만 상속받아 사용합니다.

메소드 설명
boolean empty()
해당 스택이 비어 있으면 true를, 비어 있지 않으면 false를 반환함.
E peek()
해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환함.
E pop()
해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환하고, 해당 요소를 스택에서 제거함.
E push(E item)
해당 스택의 제일 상단에 전달된 요소를 삽입함.
int search(Object o)
해당 스택에서 전달된 객체가 존재하는 위치의 인덱스를 반환함.

이때 인덱스는 제일 상단에 있는(제일 마지막으로 저장된) 요소의 위치부터 0이 아닌 1부터 시작함.

더욱 복잡하고 빠른 스택을 구현하고 싶다면 Deque 인터페이스를 구현한 ArrayDeque 클래스를 사용하면 됩니다.

Deque st = new ArrayDeque();
단, ArrayDeque 클래스는 Stack 클래스와는 달리 search() 메소드는 지원하지 않습니다.

7. 큐(Queue)

Queue 인터페이스
클래스로 구현된 스택과는 달리 자바에서 큐 메모리 구조는 별도의 인터페이스 형태로 제공됩니다.

이러한 Queue 인터페이스를 상속받는 하위 인터페이스는 다음과 같습니다.

  1. Deque

  2. BlockingDeque

  3. BlockingQueue

  4. TransferQueue

따라서 Queue 인터페이스를 직간접적으로 구현한 클래스는 상당히 많습니다.

그중에서도 Deque 인터페이스를 구현한 LinkedList 클래스가 큐 메모리 구조를 구현하는 데 가장 많이 사용됩니다.

큐 메모리 구조는 선형 메모리 공간에 데이터를 저장하면서 선입선출(FIFO)의 시멘틱을 따르는 자료 구조입니다.

즉, 가장 먼저 저장된(push) 데이터가 가장 먼저 인출(pop)되는 구조입니다.

Queue 인터페이스는 큐 메모리 구조를 표현하기 위해, 다음과 같은 Collection 인터페이스 메소드만을 상속받아 사용합니다.

메소드 설명
boolean add(E e)
해당 큐의 맨 뒤에 전달된 요소를 삽입함.

만약 삽입에 성공하면 true를 반환하고, 큐에 여유 공간이 없어 삽입에 실패하면 IllegalStateException을 발생시킴.

E element() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.
boolean offer(E e) 해당 큐의 맨 뒤에 전달된 요소를 삽입함.
E peek()
해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.

만약 큐가 비어있으면 null을 반환함.

E poll()
해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환하고, 해당 요소를 큐에서 제거함.

만약 큐가 비어있으면 null을 반환함.

E remove() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 제거함.

더욱 복잡하고 빠른 큐를 구현하고 싶다면 Deque 인터페이스를 구현한 ArrayDeque 클래스를 사용하면 됩니다.

예제
Deque qu = new ArrayDeque();

다음 예제는 여러 LinkedList 메소드를 이용하여 큐 메모리 구조를 구현한 예제입니다.

profile
<'쟤'보단 내가 낫지> 에서 '쟤'를 담당하고 있습니다.

0개의 댓글