[Java] 컬렉션 프레임워크 - List, Set, Queue, ArrayList, LinkedList, Iterator, Stack, Tree, Map
컬렉션 프레임워크
프레임워크란?
프레임워크 : 잘 정의된, 약속된 구조와 골격
컬렉션이란?
데이터를 한 곳에 모아 편리하게 저장 및 관리하는 가변 크기의 객체 컨테이너
자바의 컬렉션 프레임워크
인스턴스의 저장과 참조를 위해 잘 정의된, 클래스들의 구조
자바의 컬렉션 프레임워크가 제공하는 기능의 영역
자료구조와 알고리즘
컬렉션 프레임워크 구조
- 컬렉션 프레임워크는 인터페이스와 클래스로 구성
- 인터페이스는 컬렉션에서 수행할 수 있는 각종 연산을 제네릭 타입으로 정의해 유사한 클래스에 일관성 있게 접근하게 함
- 클래스는 컬렉션 프레임워크 인터페이스를 구현한 클래스
- java.util 패키지에 포함 (DelayQueue는 java.util.concurrent 패키지에 포함)
Collection 인터페이스
Collection 인터페이스를 구현하는 제네릭 클래스
인터페이스 | 특징 | 구현클래스 | |
Collection | List | 객체의 순서가 있고, 원소가 중복될 수 있다. | ArrayList, Stack, Vector, LinkedList |
Queue | 객체를 입력한 순서대로 저장하며, 원소가 중복될 수 있다. | DelayQueue, PriorityQueue, LinkedList | |
Set | 객체의 순서가 없으며, 동일한 원소를 중복할 수 없다. | HashSet, TreeSet, EnumSet |
Collection 인터페이스가 제공하는 주요 메서드
메서드 | 설명 |
boolean add(E e) | 객체를 맨 끝에 추가한다. |
void clear() | 저장된 모든 객체를 제거한다. |
boolean contains(Object o) | 명시한 객체의 저장 여부를 조사한다. |
boolean isEmpty() | 리스트가 비어있는지 조사한다. |
Iterator<E> iterator() | Iterator()를 반환한다. |
boolean remove(Object o) | 명시한 첫 번째 객체를 제거하고, 제거 여부를 반환한다. |
int size() | 저장된 전체 객체의 개수를 반환한다. |
T[] toArray(T[] a) | 리스트를 배열로 반환한다. |
List 컬렉션
List 특징
- 동일한 인스턴스의 중복 저장을 허용한다.
- 인스턴스의 저장 순서가 유지
배열과 유사하지만 배열과 달리 크기가 가변적!
List 인터페이스가 제공하는 주요 메서드
메서드 | 설명 |
void add(int index, E element) | 객체를 인덱스 위치에 추가한다. |
E get(int index) | 인덱스에 있는 객체를 반환한다. |
int indexOf(Object o) | 명시한 객체가 있는 첫 번째 인덱스를 반환한다. |
E remove(int index) | 인덱스에 있는 객체를 제거한다. |
E set(int index, E element) | 인덱스에 있는 객체와 주어진 객체를 교체한다. |
List<E> subList(int from, int to) | 주어진 범위에 해당하는 객체를 리스트로 반환한다. |
List 인터페이스를 구현하는 대표적인 제네릭 클래스 : ArrayList, LinkedList
ArrayList : 배열 기반으로 데이터 저장함
LinkedList
1. 리스트라는 자료 구조를 기반으로 데이터 저장
2. ArrayList의 사용 방법과 거의 동일. 다만, 데이터 저장하는 방식에서 큰 차이가 있을 뿐!
ArrayList 와 LinkedList의 차이점
Stack 클래스에 추가된 메서드
메소드 | 설명 |
boolean empty() | 스택이 비어 있는지 여부를 조사한다. |
E peek() | 스택의 최상위 원소를 제거하지 않고 엿보기 한다. |
E pop() | 스택의 최상위 원소를 반환하며, 스택에서 제거한다. |
E push(E item) | 스택의 최상위에 원소를 추가한다. |
int search(Object o) | 주어진 원소의 인덱스 값(1부터 시작)을 반환한다. |
Iterator
Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어있는 요소들을 읽어오는 방법 중 하나다.
Collection 인터페이스에는 iterator()라는 메소드가 정의되어 있다.
iterator 메소드가 반환하는 참조 값의 인스턴스는 Iterator 인터페이스를 구현하고 있다.
itertaor 메소드가 반환하는 참조값의 인스턴스를 이용하면, 컬렉션 인스턴스에 저장된 인스턴스의 순차적 접근이 가능함.
iterator 메소드가 반환형이 Iterator 이니, 반환된 참조값을 이용해서 Iterator에 선언된 함수들만 호출하면 됨
Iterator 인터페이스에 정의된 메소드
- boolean hasNext() : 참조할 다음 번 요소 (element)가 존재하면 true를 반환
- E next() : 다음 번 요소를 반환
- void remove() : 현재 위치의 요소를 삭제
사용 예시
public static void main(String[] args){
LinkedList<Integer> list = new LinkedList<Integer>();
list.add("First");
list.add("Second");
list.add("Third");
list.add("Fourth");
Iterator<String> itr = list.iterator();
System.out.println("반복자를 이용한 1차 출력과 Third 삭제");
while(itr.hasNext()){
String curStr = itr.next();
System.out.println(curStr);
if(curStr.compareTo("Third")==0)
itr.remove();
}
System.out.println("Third 삭제 후 반복자를 이용한 2차 출력");
itf = list.iterator();
while(itr.hasNext())
System.out.println(itr.next());
}
실행 결과
반복자를 사용하는 이유
- 반복자를 사용하면, 컬렉션 클래스의 종류에 상관없이 동일한 형태의 데이터 참조 방식을 유지할 수 있음.
- 컬렉션 클래스 교체에 큰 영향이 없음
- 컬렉션 클래스 별 데이터 참조 방식을 별도로 확인할 필요 없음
Queue 컬렉션
선입선출(FIFO) 방식을 지원
Queue 인터페이스에 추가된 메서드
기능 | 예외를 던짐 | 특별한 값을 반환 |
삽입 | boolean add(E e) | boolean offer(E e) |
삭제 | E remove() | E poll() |
검색 | E element() | E peek() |
Set 컬렉션
특징
1. 데이터의 저장 순서를 유지하지 않음
- 인덱스가 없어 저장 순서 무시
2. 데이터의 중복 저장을 허용하지 않음
- 단, 동일 데이터에 대한 기준은 프로그래머가 정의
public static void main(String[] args){
HashSet<String> hSet = new HashSet<String>();
hSet.add("First");
hSet.add("Second");
hSet.add("Third");
hSet.add("First"); //동일한 값 넣어줌
System.out.println("저장된 데이터 수 : " + hSet.size());
Iterator<String> itr = hSet.iterator();
while(itr.hasNext())
System.out.println(itr.next());
}
실행 결과
저장된 데이터 수 : 3
Third
Second
First
동일 인스턴스를 판단하는 기준은?!
HashSet 클래스의 인스턴스 동등 비교 방법
Object 클래스에 정의되어있는 equals 메소드의 호출 결과와 hashCode 메소드의 호출 결과를 참조하여 인스턴스의 동등 비교를 진행
활용 예시
class SimpleNumber {
int num;
...
//이 해쉬 메소드는 해쉬 그룹을 세 부류로 나눈다.
public int hashCode() { return num%3; }
public boolean equals(Object obj){
SimpleNumber comp = (SimpleNumber) obj;
if(comp.num == num)
return true;
else
return false;
}
public static void main(String[] args){
HashSet<SimpleNumber> hSet = new HashSet<SimpleNumber>();
hSet.add(new SimpleNumber(10));
hSet.add(new SimpleNumber(20));
hSet.add(new SimpleNumber(20));
System.out.println("저장된 데이터 수 : " + hSet.size());
Iterator<SimpleNumber> itr = hSet.iterator();
while(itr.hasNext())
System.out.println(itr.next());
}
실행 결과
저장된 데이터 수 : 2
20
10
TreeSet 클래스
특징
- 트리라는 자료구조를 기반으로 데이터를 저장
- 데이터를 정렬된 순서로 저장
- 데이터 중복 저장 허용 안함
- 정렬의 기준은 프로그래머가 직접 정의
정렬의 기준을 정하는 Comparable 인터페이스
- TreeSet 인스턴스에 저장이 되려면 Comparable 인터페이스를 구현해야 함
- Comparable 인터페이스의 유일한 메소드는
int compareTo(T obj);
- compareTo 메소드는 다음의 기준으로 구현
- 인자로 전달된 obj 크기가 작다면 양의 정수 반환
- 인자로 전달된 obj 크기가 크다면 음의 정수 반환
- 같다면 0 반환
- 작다, 크다, 같다의 기준은 프로그래머가 결정
예시
class Person implements Comparable<Person> {
String name;
int age;
public int compareTo(Person p) {
if (age > p.age) return 1;
else if (age < p.age) return -1;
else return 0;
}
}
public static void main(String[] args){
TreeSet<Person> sTree = new TreeSet<Person>();
sTree.add(new Person("Lee", 24);
sTree.add(new Person("Kim", 29);
sTree.add(new Person("Park", 21);
Iterator<Person> itr = sTree.iterator();
while(itr.hasNext())
System.out.println(itr.Next());
}
Map <K, V> 컬렉션
특징
- 사전처럼 키와 값 쌍으로 구성된 객체를 저장하는 자료구조 지원
- 키와 값도 모두 객체이며 키는 중복되지 않고 하나의 값에만 매핑
- 키 순서에 따라 방문 한 여부에 따라 일반적으로 다음을 사용
- 키 순서가 아닐 경우 HashMap
- 키 순서일 경우 TreeMap
- 구현 클래스 :
HashMap
,Hashtable
,TreeMap
,Properties
Map의 Collection 화를 위한 메서드
Set<K> keySet() | Map에 포함된 key를 Set 타입으로 반환 |
Collection<V> values() | Map에 포함된 value를 Collection 타입으로 반환 |
Set<Map.Entry<K, V>> entrySet() | Map에 포함된 key-value 쌍을 Set 타입으로 반환 |
Map 인터페이스가 제공하는 주요 메서드
메서드 | 설명 |
void clear() | 모든 매핑을 삭제한다 |
boolean containsKey(Object key) | 주어진 키의 존재 여부를 반환한다 |
boolean containsValue(Object value) | 주어진 값의 존재 여부를 반환한다 |
Set<Map.Entry<K, V>> entrySet() | 모든 매핑을 Set 타입으로 반환한다. |
V get(Object key) | 주어진 키에 해당하는 값을 반환한다. |
boolean isEmpty() | 컬렉션이 비어있는지 여부를 반환한다. |
Set<K> keySet() | 모든 키를 Set 타입으로 반환한다. |
V put(K key, V value) | 주어진 키값을 저장하고 값을 반환한다. |
V remove(Object key) | 키와 일치하는 원소를 삭제하고 값을 반환한다. |
int size() | 컬렉션의 크기를 반환한다. |
Collection<V> values() | 모든 값을 Collection 타입으로 반환한다. |
HashMap<K, V> 클래스의 활용 예
TreeMap<K, V> 클래스의 활용 예
'Computer Engineering > Java' 카테고리의 다른 글
[Java] 제네릭 프로그래밍 (0) | 2019.12.16 |
---|---|
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류 (0) | 2019.12.15 |
[Java] 중첩 클래스와 람다식 (0) | 2019.12.11 |
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends (0) | 2019.12.11 |
[Java] 추상클래스와 인터페이스 (0) | 2019.11.22 |
댓글
이 글 공유하기
다른 글
-
[Java] 제네릭 프로그래밍
[Java] 제네릭 프로그래밍
2019.12.16 -
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
[Java] 예외처리 - try~catch 문, throws문, 예외의 종류
2019.12.15 -
[Java] 중첩 클래스와 람다식
[Java] 중첩 클래스와 람다식
2019.12.11 -
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
[Java] 상속 - 메소드 오버로딩과 오버라이딩의 차이, 패키지, super(), 클래스 상속 extends
2019.12.11