Java

[Java] 컬렉션 프레임워크 (Collections Framework)

15호의 개발자 2021. 8. 18. 21:01
반응형

[Java] 컬렉션 프레임워크 (Collections Framework)

 

컬렉션은 여러 객체(데이터)를 모아 놓은 것을,

프레임워크는 표준화·정형화된 체계적인 프로그래밍 방식을 의미한다.

 

참고로, 자바에는 Spring 프레임워크가 유명하다.

 

 

그렇다면 컬렉션 프레임워크는,

프로그램 구현에 필요한 자료구조와 알고리즘을 구현해 놓은 라이브러리이며,

컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식이다.

 

이를 이용하면 개발에 소요되는 시간을 절약하고 최적화된 라이브러리를 사용할 수 있다.

 

컬렉션 프레임워크에서는 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공하며,

이러한 클래스를 컬렉션 클래스라고 부른다.

(컬렉션 클래스 ex. Vector, ArrayList, HashSet)

java.util 패키지에 구현되어 있다.

 

 

 

우리가 다루는 데이터는 크게 세 가지로 나뉜다.

1. List

2. Set

3. Map

 

 

List

  • 순서가 있는 데이터의 집합
  • 데이터의 중복을 허용한다.
  • ex) 대기자 명단
  • 구현 클래스: ArrayList, LinkedList, Stack, Vector

 

Set

  • 순서를 유지하지 않는 데이터의 집합(set)
  • 데이터의 중복을 허용하지 않는다.
  • ex) 소수의 집합
  • 구현 클래스: HashSet, TreeSet

 

Map

  • 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합
  • 순서는 유지되지 않고, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
  • ex) ID(key), PassWord(value)
  • 구현 클래스: HashMap, TreeMap, Hashtable, Properties

 

  순서 중복
List O O
Set X X
Map X 키-X, 값-O

 

 

 

 

크게 나누면 Collection Interface와 Map Interface 둘로 나눌 수 있다.

 

1. Collection Interface

이 중 List와 Set의 공통 부분을 모아 Collection Interface를 정의했다.

컬렉션 인터페이스는 하나의 객체의 관리를 위해 선언된 인터페이스로, 이에 필요한 기본 메서드가 선언되어있다.

하위에는 List, Set 인터페이스가 있다.

(cf. 아래에 나오는 Map 인터페이스는 쌍으로 이루어진 객체를 관리하기 위해 선언된 인터페이스이다.)

 

2. List Interface (순서 유지, 중복 허용)

List 인터페이스는 Collection의 하위 인터페이스이며,

객체를 순서에 따라 저장하고 관리하는 데 필요한 메서드가 선언되어 있다.

 

2.1 ArrayList

ArrayList는 기존의 Vector를 개선한 것이다.

Vector는 자바 2부터 제공된 클래스이며,일반적으로 ArrayList를 더 많이 사용한다.

구현 원리와 기능적으로 동일하며, 차이는 동기화 처리 여부이다.

Vector는 멀티 쓰레드 프로그램에서 동기화를 지원하지만, ArrayList는 동기화를 지원하지 않는다.

(동기화(synchronization): 두 개의 쓰레드가 동시에 하나의 리소스에 접근할 때 순서를 맞추어서 데이터의 오류가 나지 않도록 함)

 

ArrayList는 데이터의 저장공간으로 배열을 사용한다.

 

생성자는 아래와 같다.

ArrayList()
ArrayList(Collection c)
ArrayList(int initialCapacity)

(cf. capacity: 배열의 용량, size: 배열의 요소의 개수)

 

ArrayList에 저장된 객체를 삭제할 때는

첫 번째 객체부터 삭제하면 안 되고, 마지막 객체부터 삭제해야한다.

전자의 경우 배열 복사가 발생하지만, 후자의 경우 배열 복사가 발생하지 않는다.

 

for(int i=list.size()-1; i>=0; i--)

    list.remove(i);

 

 

 

2.2 LinkedList

ArrayList는 배열을 사용한다.

 

배열 장점으로는, 구조가 간단하며 데이터를 읽는 데 걸리는 시간이 짧다는 점이 있다.

 

하지만 단점으로는, 배열을 생성했으면 이후에 크기를 변경할 수 없다.

(이 경우 1)더 큰 배열을 생성한 후, 2)복사하고, 3)참조 변경해야한다.)

또한, 비순차적으로 데이터를 추가/삭제하는 경우 시간이 많이 걸린다.

 

 

이 배열의 단점을 보완하기 위해 LinkedList가 나왔다.

둘 다 자료의 순차적 구조를 구현한 클래스이지만,

ArrayList는 배열 기반이고 LinkedList는 연결 기반이다.

 

ArrayList는 배열을 구현한 클래스로 논리적 순서와 물리적 순서가 동일하다.

LinkedList는 논리적으로 순차적인 구조이지만 물리적으로는 순차적이지 않을 수 있다.

 

 

링크드 리스트는 불연속적으로 존재하는 데이터를 연결(link)한다는 의미이다.

 

그렇기 때문에 데이터를 삭제할 때도 한 번의 참조 변경만으로도 가능하고,

데이터를 추가할 때는 Node 객체를 생성한 후 두 번의 참조 변경만으로 가능하다.

 

반면, 링크드리스트는 불연속적이기 때문에 데이터 접근성이 나쁘다.

이를 해결하기 위해서는 이중 연결 리스트(doubly linked list)를 이용하면 되고,

이를 더 개선한 것이 이중 원형 연결 리스트(doubly circular linked list)이다.

 

 

Collection 읽기 추가/삭제  
ArrayList 빠르다 느리다 순차적인 추가 삭제는 더 빠르다.
비효율적인 메모리 사용
LinkedList 느리다 빠르다 데이터가 많을수록 접근성이 떨어진다.

 

 

3. Set Interface (저장 순서 유지 X, 중복 허용 X)

Set 인터페이스는 Collection의 하위 인터페이스이다.

중복을 허용하지 않고,

List는 순서 기반의 인터페이스이지만, set은 순서가 업삳.

 

아이디, 주민번호, 사번 등 유일한 값이나 객체를 관리할 때 사용한다.

 

3.1 HashSet

해시셋은 Set 인터페이스를 구현한 대표적인 컬렉션 클래스이다.

순서를 유지하려면 LinkedHashSet 클래스를 사용하면 된다.

 

저장 순서를 유지하지 않고, 중복도 허용하지 않는다.

중복을 허용하지 않으므로 저장되는 객체의 동일함 여부를 알기 위해 equals()와 hashCode() 메서드를 재정의해야 한다.

 

3.2 TreeSet

범위 검색과 정렬에 유리한 컬렉션 클래스이다.

객체의 정렬에 사용되는 클래스이며, 중복을 허용하지 않으면서 오름차순이나 내림차순으로 객체를 정렬한다.

내부적으로는 이진 검색 트리(binary search tree)로 구현되어 있다.

이진 검색 트리에 자료가 저장될 때 비교하여 저장될 위치를 정한다.

객체 비교를 위해서는 Comparable이나 Comparator 인터페이스를 구현해야 한다.

HashSet보다 데이터 추가와 삭제에 시간이 더 걸린다.

 

Iterator로 순회하기

set의 경우 get(i) 메서드로는 요소를 가져올 수 없고,

Iterator로 순회하는 방법으로 요소를 가져올 수 있다.

저장된 순서와 출력 순서는 다를 수 있다.

 

iterator()메서드 호출 방법은 아래와 같다.

Iterator ir = memberArrayList.iterator();

 

Iterator에 선언된 메서드는 hashNext와 next가 있다.

boolean hashNext() 이후에 요소가 더 있는지를 체크하는 메서드, 요소가 있다면 true를 반환한다.
E next() 다음에 있는 요소를 반환한다.

 

 

Comparable 인터페이스 & Comparator 인터페이스

전렬 대상이 되는 클래스가 구현해야 하는 인터페이스이다.

일반적으로 Comparable을 더 많이 사용하고,

이미 Comparable이 구현된 경우에는 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있다.

 

Comparable은 compareTo() 메서드를 구현하고, 매개 변수와 객체 자신(this)를 비교한다.

Comparator은 compare() 메서드를 구현하며, 두 개의 매개 변수를 비교한다.

 

Comparator은 TreeSet 생성자에 Comparator가 구현된 객체를 아래와 같이 매개변수로 전달해야 한다.

TreeSet<ClassA> treeSet = new TreeSet<ClassA>(new ClassA());

 

4. Map Interface (순서 유지 X, 키는 중복 허용 X, 값은 중복 허용)

Map 인터페이스는 쌍(pair)으로 이루어진 객체를 관리하기 위해 선언된 인터페이스이고, 이에 필요한 여러 메서드가 선언되어 있다.

Map을 사용하는 객체는 key-value 쌍으로 되어 있고, 이때 key는 중복될 수 없다.

검색을 위한 자료 구조이며, key를 이용하여 값을 저장하거나 검색/삭제할 때 사용하면 편리하다.

 

내부적으로는 hash 방식으로 구현된다.

index = hash(key)    //index는 저장 위치

key가 되는 객체는 객체의 유일성의 여부를 알기 위해  equals()와 hashCode() 메서드를 재정의하는 과정이 필요하다.

 

4.1 HashMap

Map 인터페이스를 구현한 클래스 중 가장 일반적으로 사용하는 클래스이다.

HashTable 클래스는 자바2부터 제공된 클래스로 Vector처럼 동기화를 제공한다.

pair 자료를 쉽고 빠르게 관리할 수 있다.

 

4.2 TreeMap

key 객체를 정렬하여 key-value를 pair로 관리하는 클래스이다.

key에 사용되는 클래스에 Comparable, Comparator 인터페이스를 구현해야 한다.

java에 많은 클래스들은 이미 Comparable이 구현되어 있으므로,

이렇게 구현된 클래스를 key로 사용하는 경우에는 구현할 필요는 없다.

 

4.3 Properties

 

 

(출처: 유튜브 남궁성의 정석코딩)

반응형