컬렉션 프레임워크
java.util 패키지에 자료구조 바탕으로 객체들을 효율적으로 추가, 삭제 ,검색할 수 있도록 관련된 인터페이스와 클래스들을 포함시켜두었다. 이것을 Collection Framework라고 부른다.
컬렉션의 종류
![](https://velog.velcdn.com/images/namsm17/post/4bf66296-e647-4d95-ab6f-11ca6e528c1f/image.png)
List와 Set은 객체를 추가, 삭제, 검색하는 방법에 있어서 공통점이 있기 때문에 공통된 메소드만 따로 모아 Collection 인터페이스로 정의해 두고 이것을 상속하고 있다.
인터페이스 분류 | 특징 | 구현 클래스 |
---|
List(Collection) | 순서를 유지하고 저장하며 중복 저장 가능 | ArrayList,Vector, LinkedList |
Set(Collection) | 순서를 유지하지 않고 저장하며 중복 저장 불가 | HashSet, TreeSet |
Map | 키와 값으로 구성된 엔트리 저장, 키는 중복 저장 불가 | HashMap, Hashtable, TreeMap, Properties |
List 컬렉션
List 컬렉션은 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다.
객체 추가
메소드 | 설명 |
---|
boolean add(E e) | 주어진 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체를 추가 |
set(int index, E element) | 주어진 인덱스의 객체를 새로운 객체로 바꿈 |
객체 검색
메소드 | 설명 |
---|
boolean Contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
E get(int index) | 주어진 인덱스에 저장된 객체를 리턴 |
isEmpty() | 컬렉션이 비어 있는지 조사 |
int size() | 저장되어 있는 전체 객체 수를 리턴 |
객체 삭제
메소드 | 설명 |
---|
void clear() | 저장된 모든 객체를 삭제 |
E remove(int index) | 주어진 인덱스에 저장된 객체를 삭제 |
boolean remove(Object o) | 주어진 객체를 삭제 |
ArrayList에 객체를 추가하면 내부 배열에 객체가 저장된다. 일반 배열과의 차이점은 ArrayList는 제한 없이 객체를 추가할 수 있다는 점이다.
![](https://velog.velcdn.com/images/namsm17/post/8211fed2-96d7-4c52-953f-3bfa5f92f111/image.png)
List 컬렉션은 객체의 번지를 저장한다, 또한 동일 객체를 중복 저장 가능한데 이 경우 동일한 번지가 저장되며 null 또한 저장이 가능하다.
List<E> list = new ArrayList<E>();
List<E> list = new ArrayList<>();
List list = new ArrayList();
타입 파라미터 E에는 ArrayList에 저장하고 싶은 객체를 저장하면 되며 List에 지정한 객체 타입과 동일하다면 ArrayList<>아 같이 객체 타입 생략 가능하며 객체 타입 모두 생략하면 모든 종류의 객체를 저장할 수 있다.
ArrayList 컬렉션에 객체 추가시 인덱스 0번부터 차례대로 저장되며 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 '1'씩 당겨진다. 반대로 삽입시에는 '1'씩 밀려난다
아래 그림이 4번 인덱스 제거시 뒤 인덱스가 1씩 당겨지는 모습이다.
![](https://velog.velcdn.com/images/namsm17/post/005860f7-aeaf-4d12-895c-924cdc0bedc2/image.png)
Vector
Vector는 ArrayList와 동일한 내부 구조를 가지고 있다. 차이점은 Vector는 동기화된 메소드로 구성되어 있기 멀티 스레드가 Vector()메소드를 실행할 수 없다는 것이다. 그렇기 때문에 멀티 스레드 환경에서는 안전하게 객체를 추가 또는 삭제할 수 있다.
List<E> list = new Vector<E>();
List<E> list new Vector<>();
List list = new Vector();
타입 파리미터 E에는 Vector에 저장하고 싶은 객체 타입을 지정하면 된다. List에 지정한 객체 타입과 동일하다면 Vector<>와 같이 객체 타입을 생략할 수도 있다. 객체 타입을 모두 생략하면 모든 종류의 객체를 저장할 수 있다.
LinkedList
LinkedList는 ArrayList와 사용 방법은 동일하지만 내부 구조는 다르다. ArrayList는 내부 배열에 객체를 저장하지만, LinkedList는 인접 객체를 체인처럼 연결해서 관리한다.
특정 위치에서 객체를 삽입하거나 삭제하면 바로 앞뒤 링크만 변경하면 되므로 빈번한 객체 삭제와 삽입이 일어나는 곳에 쓰인다.
List<E> list = new LinkedList<E>();
List<E> list new LinkedList<>();
List list = new LinkedList();
Set 컬렉션
List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션 저장 순서가 유지되지 않는다. 객체 또한 중복 저장 불가하고 하나의 null만 저장할 수 있다.
Set 컬렉션은 구슬 주머니와 같다고 생각하면 된다
![](https://velog.velcdn.com/images/namsm17/post/2357e63a-5a15-4854-8c55-d3cd4452451b/image.png)
Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있는데, 공통적으로 사용 가능한 Set 인터페이스의 메소드는 다음과 같으며 인덱스를 매개값으로 갖는 메소드가 없다.
객체 추가
메소드 | 설명 |
---|
boolean add(E e) | 주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false를 리턴 |
객체 검색
메소드 | 설명 |
---|
boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
isEmpty() | 컬렉션이 비어 있는지 조사 |
lterator<E> iterator() | 저장된 객체를 한 번씩 가져오는 반복자 리턴 |
int size() | 저장되어 있는 전체 객체 수 리턴 |
객체 삭제
메소드 | 설명 |
---|
void clear() | 지정된 모든 객체를 삭제 |
boolean remove(Obect o) | 주어진 객체를 삭제 |
HashSet
가장 많이 사용되는게 HashSet이다.
Set<E> set = new HashSet<E>();
Set<E> set = new Hashset<>();
Set set = new HashSet();
HashSet은 동일한 객체는 중복 저장하지 않는다.(동등 객체)
또한 다른 객체라도 hashCode()메소드의 리턴값이 같고, equals() 메소드가 true를 리턴한다면 동일한 객체라고 판단하여 중복 저장하지 않는다.
Set컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다. 대신 객체를 한 개씩 반복해서 가져와야 하는데, 여기에는 2가지 방법이 있다.
Set<E> set = new set<>();
for(E e : set) {
...
}
그리고 iterator()메소드로 반복자를 얻어 객체를 하나씩 가져오는 것이다.
Set<E> set = new HashSet<>();
Iterator<E> iterator = set.iterator();
iterator는 Set컬렉션의 객체를 가져오거나 제거하기 위해 아래와 같은 메소드를 제공
리턴 타입 | 메소드명 | 설명 |
---|
boolean | hashNext() | 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다. |
E | next() | 컬렉션에서 하나의 객체를 가져온다. |
void | remove() | next()로 가져온 객체를 Set 컬렉션에서 제거한다. |
Map 컬렉션
Map 컬렉션은 키와 값으로 구성된 엔트리 객체를 저장한다. (키와 값은 객체) 키는 중복 저장 불가하지만 값은 가능하다. 기존에 저장된 동일한 값을 키에 저장하면 기존 값이 새로운 값으로 대체된다.
![](https://velog.velcdn.com/images/namsm17/post/0f91d1dc-1cd6-4474-9246-7c88c2cda393/image.png)
Map 컬렉션에는 HashMap, HashTable, LinkedHashMap, properties, TreeMap 등이 있다. Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스 메소드는 다음과 같다. 키로 객체들을 관리하기 때문에 키를 매개값으로 갖는 메소드가 많다.
![](https://velog.velcdn.com/images/namsm17/post/76bd0d91-f495-4d0d-a7f0-26cb2ec82a25/image.jpeg)
HashMap
HashMap은 키로 사용할 객체가 hashCode() 메소드의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우, 동일 키로 보고 중복 저장을 허용하지 않는다.
![](https://velog.velcdn.com/images/namsm17/post/3a12a345-5d46-4b68-93fa-1367e903cb2f/image.png)
키는 String, 값은 Integer 타입으로 갖는 HashMap은 아래와 같이 생성 가능하다. Map에 지정된 키와 값의 타입이 HashMap과 동일 시, HashMap<>을 사용할 수 있다.
Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map = new HashMap<>();
모든 타입의 키, 객체를 저장할 수 있도록 HashMap 생성이 가능하지만 이런 경우는 거의 없다.
Map map = new HashMap();
HashMap 사용 방법 예제
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap< >();
map.put("신용권", 85);
map.put("홍길동", 90);
map.put("동장군", 80);
map.put("홍길동", 95);
System.out.println("총 Entry 수: " + map.size());
System.out.println();
String key = "홍길동";
int value = map.get(key);
System.out.println(key + ": " + value);
System.out.println();
Set<String> keySet = map.keySet();
Iterator<String> keyIterator = keySet.iterator();
while (keyIterator.hasNext()) {
String k = keyIterator.next();
Integer v = map.get(k);
System.out.println(k + " : " + v);
}
System.out.println();
Set<Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Entry<String, Integer>> entryIterator = entrySet.iterator();
while (entryIterator.hasNext()) {
Entry<String, Integer> entry = entryIterator.next();
String k = entry.getKey();
Integer v = entry.getValue();
System.out.println(k + " : " + v);
}
System.out.println();
map.remove("홍길동");
System.out.println("총 Entry 수: " + map.size());
System.out.println();
}
}
Hashtable
Hashtable은 HashMap과 동일한 내부 구조를 가지고 있다. 차이점은 Hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Hashtable의 메소드들을 실행할 수 없다는 것이다. 따라서 멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있다.
검색 기능을 강화시킨 컬렉션
컬렉션 프레임워크는 검색 기능을 강화시킨 TreeSet과 TreeMap을 제공한다. 이름에서 알 수 있듯이 TreeSet은 Set컬렉션이고, TreeMap은 Map 컬렉션이다.
TreeMap
TreeMap은 이진 트리를 기반으로 한 Map 컬렉션이다. Treeset과의 차이점은 키와 값이 저장된 Entry를 저장한다는 점이다. TreeMap에 엔트리를 저장하면 키를 기준으로 자동 정렬되는데, 부모 키 값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽 자식 노드에 Entry 객체를 저장한다.
LIFO와 FIFO 컬렉션
후입선출(LIFO) 선입선출(FIFO). 컬렉션 프레임워크는 LIFO 자료구조를 제공하는 스택 클래스와 FIFO 자료구조를 제공하는 큐 인터페이스를 제공하고 있다.![](https://velog.velcdn.com/images/namsm17/post/7dd3abc5-0537-4e12-b557-8186bcec9be1/image.jpeg)
Stack
리턴 타입 | 메소드 | 설명 |
---|
E | push(E item) | 주어진 객체를 스택에 넣는다. |
E | pop() | 스택의 맨 위 객체를 빼낸다. |
Queue
리턴 타입 | 메소드 | 설명 |
---|
boolean | offer(E e) | 주어진 객체를 큐에 넣는다. |
E | poll() | 큐에서 객체를 빼낸다. |
사실 이 챕터는 자바 자료구조를 따로 봐야할듯
챕터 15 확인문제 (솔직히 이해가 지금은 안됨 D-13때 만나요~)
1. 4번
2. 3번
3. 4번
4. 3번
5.
List<Board> arrayList = new ArrayList<>();
6.
Map<String, Integer> hashMap = new HashMap<>();
7.
import java.util.ArrayList;
import java.util.List;
public class BoardDao {
public List<Board> getBoardList() {
List<Board> list = new ArrayList<Board>();
list.add(new Board("제목1", "내용1"));
list.add(new Board("제목2", "내용2"));
list.add(new Board("제목3", "내용3"));
return list;
}
}
8.x
@Override
public int hashCode() {
return studentNum;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Student)) return false;
Student student = (Student) obj;
if (studentNum != student.studentNum) return false;
return true;
}
9.
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("blue", 96);
map.put("hong", 86);
map.put("white", 92);
String name = null;
int maxScore = 0;
int totalScore = 0;
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
if (entry.getValue() > maxScore) {
name = entry.getKey();
maxScore = entry.getValue();
}
totalScore += entry.getValue();
}
int avgScore = totalScore / map.size();
System.out.println("평균 점수: " + avgScore);
System.out.println("최고 점수: " + maxScore);
System.out.println("최고 점수를 받은 아이디: " + name);
}
}
10.
implements Comparable<Student>
@Override
public int compareTo(Student o) {
if (score < o.score) {
return -1;
}else if (score = =o.score) {
return 0;
}
}else {
return 1;
}
}
11. 4번
12. 3번
13. 4번