컬렉션(Collections) - 데이터 군집, 자료
프레임워크(Framework) : 표준화된 설계
데이터 군을 다루는데 필요한 클래스를 표준화서 설계
java.util

Collection은 List와 Set의 상위 인터페이스
Collection 인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고, 삭제하는 등 컬렉션을 다루는데 가장 기본이적인 메서드들을 정의하고 있다.

java.util.list순차자료 구조에 대한 설계- 순서가 있는 자료, 예) 배열
- 특정 순서에 추가, 제거, 변경 등의 매개변수가 정의된 메서드가 많이 존재
- 매개변수가 주로
int index로 이루어져있다.
boolean add(E e)boolean add(int index, E e)boolean addAll(Collection<? extends E> ...)boolean addAll(int index, Collection ..)E get(int index)int indexOf(Object e) : 특정 요소의 위치 번호(왼쪽 👉 오른쪽), 없을때는 -1int lastIndexOf(Object e) : 특정 요소의 위치 번호(오른쪽 👉 왼쪽), 없을때는 -1boolean contains(Object e)boolean containsAll(Collection<?> ..)E set(int index, E e): 특정 위치에 있는 요소를 변경E remove(int index): 특정 순서 위치에 있는 요소 제거(꺼낸다...)boolean remove(Object e)boolean removeAll(Collection ...)int size() : 요소의 갯수void clear() : 요소 비우기retailAll(Collection ..): 매개변수에 있는 값만 유지하고 모두 제거(교집합)
- 배열을 구현한 클래스
- 스택 구현시 활용 가능
- 쓰레드 안정성 확보 ❌
- 배열은 물리적으로 붙어 있는 나열 구조 👉 순차 조회는 매우 빠름
- List 구현 클래스 중 가장 많이 사용
Clss ArrayList<E> java.lang.Object java.util.AbstractCollection<E> java.util.AbstarctList<E> java.util.ArrayList<E>
ArrayList의 기본 배열 갯수의 문제점
기본 생성 배열 갯수 10이다.
공간의 갯수가 부족하면 👉 배열이 2배 크기로 새로 생성되어진다.
해결방안) 데이터의 양을 충분히 예상 할 수 있는 경우는 충분한 크기를 만들어야 성능이 좋다.
위치(순서)가 변경되는 수정, 삭제의 문제점
배열은 위치(순서)를 변경할수 없기 때문에 순서가 변경되는 수정, 삭제는 새로운 배열이 매번 생성 되어 성능저하를 야기시킨다.
👉 제거를 역순으로 하여 위치(순서)변경이 없도록 유도
👉 위치(순서)가 자주 변경되는 자료에서 불리하다.public class Ex01{ public static void main(String[] args){ ArrayList<String> names = new ArrayList<>(); names.add("이름1"); //추가 names.add("이름2"); names.add("이름3"); names.add("이름4"); names.add("이름5"); System.out.println(names); // names.toString() 담긴 값을 확인할 수 있도록 재정의 for( int i=0; i<names.size(); i++){ String name = names.get(i); // 조회 System.out.println(name); } for( int i=0; i<names.size(); i++){ names.remove(i); //제거 //삭제가되면 위치를 변경할수가 없기 때문에 새로운 객체로 재형성됨 //제거를 역순으로 하는것이 제일 좋다. } for(int i = names.size() -1 ; i>=0 ; i--){ names.remove(i); //역순으로 제거함으로써 객체를 재형성하지 않아도된다. } for(int i = 0 ; i < names.size();i++){ //조회 System.out.println(names.get(i)); } } }
E pop(): 끝 요소 꺼내기E push(E e): 끝에 추가
public class Ex02 {
public static void main(String[] args) {
Stack<String> names = new Stack<>();
names.push("이름1"); //추가
names.push("이름2");
names.push("이름3");
System.out.println(names.pop()); //꺼내기
System.out.println(names.pop());
System.out.println(names.pop());
//> 이름3, 이름2, 이름1
}
}
- ArrayList 동일 / 배열을 구현한 클래스
- 쓰레드 안정성 확보
- 과거 기능의 호환성 유지를 위해 남겨둠.
capacity(): 백터의 크기를 확인할수있음.
package exam04;
import java.util.Vector;
public class Ex03 {
public static void main(String[] args) {
Vector<String> names = new Vector<String>(3); //공간을 3으로 설정
System.out.println(names.capacity()); //기본값은 10
names.add("이름1");
names.add("이름2");
names.add("이름3");
names.add("이름3");
System.out.println(names.capacity()); //공간이 넘쳤기 때문에 크기가 두배로 증가.
}
}
- 다음 요소, 이전 요소를 주소를 가지고 서로 연결 관계(물리적 순서 ❌, 논리적 순서⭕️)
- 수정 삭제 등 순서 위치가 자주 변경되는 자료에서 유리 주소를 모두 가지고 있는 형태
- 다음 요소 위치 주소만 변경하면 되므로, 성능 저하 ❌
- 논리적 순서이므로 위치를 계산하는 일을 더 수행하므로 ArrayList 보다는 조회에서 불리
- 자바는 DoublyLinkedList 형태로 구현, 다음요소, 이전요소의 주소를 모두 가지고 있는 형태
Clss LinkedList<E> java.lang.Object java.util.AbstractCollection<E> java.util.AbstarctList<E> java.util.AbstractSequentialList<E> java.util.LinkedList<E>
설계가 동일하기 때문에 ArrayList와 LinkedList는 서로 호환이 가능.
LinkedList상위에는 List가 있기 때문에 다형성을 통해 변경이 가능하다.(업캐스팅) ArrayList도 동일public class Ex01{ public static void main(String[] args){ List<String> names = new LinkedList<>(); names.add("이름1"); //추가 names.add("이름2"); names.add("이름3"); names.add("이름4"); names.add("이름5"); ... } }
boolean offer(E e) : 끝에 요소 추가E poll() : 앞에서 요소 꺼내기boolean offerFirst(E e) : 요소 앞에추가boolean offerLast(E e) : 요소 뒤에추가E poolFirst() : 가장 앞에 요소 꺼내기E poolLast() : 가장 뒤에 요소 꺼내기public class Ex04 {
public static void main(String[] args) {
Queue<Integer> items = new LinkedList<>(); //다형성으로 가능
items.offer(1);
items.offer(2);
items.offer(3);
System.out.println(items.poll()); //1
System.out.println(items.poll()); //2
System.out.println(items.poll()); //3
}
}

집합자료 구조에 대한 설계
java.util.set- 중복이 없는 자료
- 중복 제거 기준 : 동등성 비교 -
equals()andhashCode()- 순서 유지는 중요 ❌
- 조회 수정 불가
boolean add(E e)boolean addAll(Collection..)boolean remove(Object e)boolean removeAll(Collection ...)int size() : 요소의 갯수void clear() : 전체 비우기boolean contains(Object e)boolean containsAll(Collection<?> ..)boolean retainAll(Collection<?>..)HashSet으로 객체를 생성할경우 순서는 지켜지지 않는다.
정렬을 원하면 TreeSet으로 객체를 생성하고 java.lang.Comparable에 있는 추상메서드Int compareTo(T o)를 정의해야한다.public class Ex04 { public static void main(String[] args) { HashSet<String> names = new HashSet<>(); names.add("이름1"); names.add("이름2"); names.add("이름3"); names.add("이름4"); names.add("이름5"); System.out.println(names); //names.toString() } }
HashSet + 정렬
SortedSet 인터페이스
기준
equlas() and hashCode()Int compareTo(T o)를 정의해야한다.
사전 자료 구조에 대한 설계
V put(K key, V vlaue)void putAll(Map...)V putlfAbsent(K key, V value)V get(Object key)V getOrDefault(Object key, V defaultValue)Set<Map.Entry<K,V>> entrySet() : 전체 키를V put(Object key, V value): key를 가지고 제거V repalce(K key, V value)boolean replace(K key, V oldValue, V newValue): 기존 값이 oldValue로 일치하는 경우메만 newValue로 변경V remove(Object key) : key를 가지고 제거boolean remove(Object key, Object value) : key와 value가 일치하는 요소만 제거.int size() : 요소의 갯수Set<K>KeySet() : Map에 포함되어 있는 키값만 추출Collection<V> values() : Map에 포함되어 있는 값만 추출boolean containsKey(Object key) : Map key가 포함되어 있는지 여부boolean containsValue(Object value) : Map에 value가 포함되어 있는지 여부키 값의 정렬
기본 정렬 기준 : java.lang.Comparable/int compareTo(...)
대안 정렬 기준 : java.util.Comparator /int compare(...)
Iterator : 반복자 패턴 인터페이스
Enumeration : 동일한 반복자 패턴 구현 인터페이스, Iterator보다 먼저 등장Collection
Iterator <E> iterator()
boolean hasNext(): 다음 요소가 있는지 체크E next() : 다음 커서로 이동 요소를 조회public class Ex01 {
public static void main(String[] args) {
ArrayList<Book> books = new ArrayList<>();
books.add(new Book(1000,"책1","저자1"));
books.add(new Book(1001,"책2","저자2"));
books.add(new Book(1002,"책3","저자3"));
books.add(new Book(1003,"책4","저자4"));
books.add(new Book(1004,"책5","저자5"));
Iterator<Book> iter = books.iterator();
while(iter.hasNext()){
Book book = iter.next();
System.out.println(book);
}
iter = books.iterator(); //커서가 뒤에 있기때문에 다시 값을 초기화해주어야 커서가 맨앞으로간다.
while(iter.hasNext()){
Book book = iter.next();
System.out.println(book);
}
}
}
ListIterator
hasNext(), next() : 순방향조회hasPrevious(), previous(), previousIndex(): 역방향 조회nextIndex() : 현재 인덱스 번호public class Ex02 {
public static void main(String[] args) {
ArrayList<Book> books = new ArrayList<>();
books.add(new Book(1000,"책1","저자1"));
books.add(new Book(1001,"책2","저자2"));
books.add(new Book(1002,"책3","저자3"));
books.add(new Book(1003,"책4","저자4"));
books.add(new Book(1004,"책5","저자5"));
ListIterator<Book> iter = books.listIterator();
System.out.println("-----순방향-----");
while(iter.hasNext()){
Book book = iter.next();
int index = iter.nextIndex();
System.out.println(book);
System.out.println("index : " + index);
}
System.out.println("-----역방향-----");
while(iter.hasPrevious()){
Book book = iter.previous();
int index = iter.previousIndex();
System.out.println(book);
System.out.println("index : " + index);
}
}
}
public class Ex02 {
public static void main(String[] args) {
ArrayList<Book> books = new ArrayList<>();
books.add(new Book(1000,"책1","저자1"));
books.add(new Book(1001,"책2","저자2"));
books.add(new Book(1002,"책3","저자3"));
books.add(new Book(1003,"책4","저자4"));
books.add(new Book(1004,"책5","저자5"));
for(Book book : books) { //향상된 for문
system.out.println(book);
}
books.forEach(System.out::println);
}
}
기본 정렬 기준 인터페이스
java.lang.Comparable
기본 정렬 기준 : Natural Ordering
int compareTo(T o2)
public class Book implemnets Comparable<book> {//comapreTo 추상메서드를 정의하지 않으면 오류가 발생한다.
private int isbn;
private String title;
private String author;
public Book(int isbn, String title, String author)
{
this.isbn = isbn;
this.title = title;
this.author = author;
}
//comapreTo 추상메서드를 구현해야한다.
public int comapreTo(Book o){
return isbn - o.isbn; //오름차순
return o.isbn - isbn; //내림차순
}
}
대안적인 정렬 기준 인터페이스
naturalOrder() : 기분 정렬 기준 사용한 정렬(java.lang.Comparable, int compareTo(..))reversedOrder() : 기본 정렬 기준의 반대public class Ex04 {
public static void main(String[] args) {
//HashSet<String> names = new HashSet<>();
Comparator<String> comp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2); //오름차순
//return o2.compareTo(o1); //내림차순
// return o1.compareTo(o2) * -1; //내림차순
}
};
Set<String> names = new TreeSet<>(comp); //매개변수에 위에서 오버라이딩한 Comparator를 넣게 되면 해당 기준으로 정렬된다.
//String에서는 내부에 Comparable이 정의 되어있기때문에 정렬기준으로 정렬이된다.
//또한 내부에서 final로 정의되어있기때문에 외부에서 재정의가 불가능하기 때문에,
//항상 오름차순으로만 정렬된다.
names.add("이름1");
names.add("이름2");
names.add("이름4");
names.add("이름3");
names.add("이름5");
System.out.println(names); //names.toString()
}
}
Comparator.reverseOrder())
package exam01;
public class Ex04 {
public static void main(String[] args) {
Set<String> names = new TreeSet<>(Comparator.reverseOrder());
names.add("이름1");
names.add("이름2");
names.add("이름4");
names.add("이름3");
names.add("이름5");
System.out.println(names); //names.toString()
}
}
java.util.Arrays참고)