▶ 컬렉션
- 여러 객체(데이터)를 모아 놓은 것을 의미
▶ 프레임워크
- 표준화, 정형화된 체계적인 프로그래밍 방식
▶ 컬렉션 프레이워크
- 컬렉션을 다루기 위한 표준화된 프로그래밍 방식
- 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공
▶ 컬렉션 클래스
- 다수의 데이터를 저장할 수 있는 클래스
- 순서O, 중복O
- 순서X, 중복X
- 순서X, 중복(키X, 값O)
- ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일
- List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용
- 데이터의 저장공간으로 배열을 사용(배열기반)
장점
: 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간이 짧다
단점
: 크기를 변경할 수 없다
- 크기를 변경해야 하는 경우 새로운 배열을 생성 후 데이터를 복사해야 함
- 크기 변경을 피하기 위해 충분히 큰 배열을 생성함녀, 메모리가 낭비됨
: 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다.
- 데이터를 추가하거나 삭제하기 위해, 다른 데이터를 옮겨야 함
- 그러나 순차적인 데이터 추가(끝에 추가)와 삭제(끝부터 삭제)는 빠름
- 배열의 단점을 보완
- 배열과 달리 LinkedList는 불연속적으로 존재하는 데이터를 연결
ArrayList와 LinkedList - 성능비교
Stack
: LIFO구조. 마지막에 저장된 것을 제일 먼저 꺼내게 한다.
수식계산, 수식괄호검사, undo/redo, 뒤로/앞으로(웹브라우저)
Queue
: FIFO구조. 제일 먼저 저장한 것을 제일 먼저 꺼내게 된다.
최근 사용문서, 인쇄작업대기목록, 버퍼(buffer)
- 배열을 다루기 편리한 메서드 제공
1. 배열의 출력 - toString()
2. 다차원 배열의 비교와 출력 - deepEquals(), deepToString(), equals()
3. 배열의 복사 - copyOf()
4. 배열의 출력 - fill(), setAll()
5. 배열을 List로 변환 - asList
6. 배열의 정렬과 검색 - sort()
- 순서X, 중복X
- Set인터페이스를 구현한 대표적인 컬렉션 클래스
- 순서를 유지하려면, LinkedHashSet클래스를 사용하면 됨
- HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는 확인하고 같은 객체가 없으면 저장, 있으면 저장하지 않는다.
- 저장할 객체의 equals()와 HashCode()를 호출, equals()와 HashCode()가 오버라이딩 되어 있어야 함
▶ 동일 객체에 대해 hashCode()를 여러 번 호출해도 동일한 값을 반환해야 한다.
▶ equals()로 비교해서 true를 얻은 두 객체의 hashCode()값은 일치해야 한다.
equals()로 비교한 결과가 false인 두 객체의 hashCode()값이 같을 수도 있다.
그러나 성능 향상을 위해 가능함녀 서로 다른 값을 반환하도록 작성하자.
- 순서X, 중복(키X, 값O)
- HashMap(동기화X)은 Hashtable(동기화O)의 신버전
- Map인터페이스를 구현한 대표적인 컬렉션 클래스
- 순서를 유지하려면, LinkedHashMap클래스를 사용하면 됨.
- 해싱기법으로 데이터를 저장하고, 데이터가 많아도 검색이 빠르다
- Map인터페이스를 구현, 데이터를 키와 값의 쌍으로 저장
해싱
- 해시함수로 해시테이블에 데이터 저장, 검색
- 해시테이블은 배열과 링크드 리스트가 조합된 형태
주석에 설명..
package ch11;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.Stack;
public class S01 {
public static void main(String[] args) {
// 순서가 있고 데이터 중복이 가능하다
List list = new ArrayList<>();
// 순서가 없고 데이터 중복이 불가능하다
// key만으로 이루어져 있다
Set set = new HashSet<>();
// 순서가 없고 key, value로 이루어져있다
// key는 중복이 불가능하고 value는 중복이 가능하다
Map map = new HashMap<>();
// 나중에 들어온 값이 먼저 나간다
Stack Stack = new Stack<>();
// 먼저 들어온 값이 먼저 나간다
Queue queue = new LinkedList<>();
}
}
주석에 설명..
package ch11;
import java.util.ArrayList;
import java.util.List;
public class S02 {
public static void main(String[] args) {
List list = new ArrayList<>();
System.out.println(list.size());
list.add("바나나");
System.out.println(list.size());
System.out.println(list);
list.add("사과");
list.add("바나나");
// add한 순서대로 정렬이 되어있다
System.out.println(list);
System.out.println(list.get(1));
list.set(1, "멜론");
System.out.println(list);
list.remove(0);
System.out.println(list);
}
}
주석에 설명..
package ch11;
import java.util.HashSet;
import java.util.Set;
public class S03 {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("바나나");
set.add("사과");
set.add("바나나");
set.add("멜론");
set.add("망고");
set.add("딸기");
System.out.println(set);
// set은 순서가 없기 때문에 번호로 갑을 가져올 수 없다
// set.get();
// set은 리스트 안에 값이 있는지 없는지 파악할 때 사용한다
System.out.println(set.contains("파인애플")); // false
}
}
주석에 설명..
package ch11;
import java.util.HashMap;
import java.util.Map;
public class S04 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String,String>();
map.put("사과", "3개");
map.put("바나나", "1개");
map.put("멜론", "2개");
System.out.println(map); //{멜론=2개, 사과=3개, 바나나=1개}
System.out.println(map.get("사과")); //3개
map.remove("멜론");
// 이름과 값 둘 다 중요할 때 사용한다
System.out.println(map); //{사과=3개, 바나나=1개}
}
}
주석에 설명..
package ch11;
import java.util.Stack;
public class S05 {
public static void main(String[] args) {
Stack<String> stack = new Stack<String>();
stack.push("사과");
stack.push("바나나");
stack.push("멜론");
System.out.println(stack); //[사과, 바나나, 멜론]
stack.pop();
System.out.println(stack); //[사과, 바나나]
}
}
주석에 설명..
package ch11;
import java.util.LinkedList;
import java.util.Queue;
public class S06 {
public static void main(String[] args) {
Queue queue = new LinkedList<String>();
queue.add("사과");
queue.add("바나나");
queue.add("멜론");
System.out.println(queue); //[사과, 바나나, 멜론]
queue.poll();
System.out.println(queue); //[바나나, 멜론]
// 선입선출 - 음식점, 은행 번호표, 롤큐
System.out.println(queue); //[바나나, 멜론]
}
}