Collection (컬렉션)
데이터의 집합, 그룹
다수의 요소를 하나의 그룹으로 묶어, 효율적으로 저장/관리할 수 있는 기능을 제공하는 컨테이너
기본형 변수가 아닌, 참조형 변수를 저장
프레임워크
표준화된 프로그래밍
라이브러리 vs 프레임워크
컬렉션 프레임워크 (JCF, Java Collection Framework) (컬렉션 + 프레임워크)
데이터의 그룹을 저장하는 클래스들을 표준화한 설계
컬렉션 프레임워크 vs 배열
아래의 장점들 덕분에, 프로그램의 유지보수가 수월하다.
인터페이스(List, Queue, Set, Map 등...)를 제공하고,
이를 구현하는 클래스를 제공하여 일관된 API 를 사용할 수 있다.
가변적인 저장 공간을 제공
(↔ 배열 : 고정적인 저장 공간)
자료구조, 알고리즘을 구현하기 위한 코드를 직접 작성할 필요 X
이미 구현된 컬렉션 클래스를 목적에 맞게 선택하여 사용하면 된다.
제공되는 API 의 코드는 검증되었으며, 고도로 최적화 되어있다.
Enumeration
Iterator
컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 인터페이스
Collection 인터페이스에 정의된 메서드
주로 while 반복문으로 사용
ListIterator
import java.util.*;
class Ex {
  public static void main(String[] args) {
      ArrayList list = new ArrayList();		// 다른 컬렉션으로 변경하고 싶다면, 이 부분만 변경하면 된다
      list.add("1");
      list.add("2");
      list.add("3");
      list.add("4");
      list.add("5");
      Iterator it = list.iterator();
     
      while (it.hasNext()) {			// boolean hasNext() : 읽어올 요소가 있는지 확인
          Object obj = it.next();		// Object next() : 다음 요소를 반환
          System.out.println(obj);
     }
}
/* 출력 결과
1
2
3
4
5
*/
컬렉션을 정렬하는데 필요한 메서드를 정의하는 인터페이스
Comparable
기본 정렬 기준을 구현하는데 사용
기본적으로 오름차순으로 정렬
Comparator
기본 정렬 기준이 아닌, 다른 기준으로 정렬할 때 사용
오름차순이 아닌, 내림차순 or 다른 기준으로 정렬
문자열을 대소문자 구분없이 정렬
public interface Comparator {
	int compare(Object o1, Object o2);		// o1 과 o2 를 비교
    boolean equals(Object obj);
}
반환 값
비교하는 객체 == 해당 객체 : 0 을 반환
비교하는 객체 > 해당 객체 : - (음수) 를 반환
비교하는 객체 < 해당 객체 : + (양수) 를 반환
// 방법 1
public interface Comparator {
	int compareTo(Object o);		// o 와 객체 자신(this) 을 비교
}
// 방법 2 : 간단한 뺄셈으로도 가능
...
return thisVal - anotherVal;
반환 값
비교하는 객체 == 해당 객체 : 0 을 반환
비교하는 객체 > 해당 객체 : - (음수) 를 반환
비교하는 객체 < 해당 객체 : + (양수) 를 반환
방법 2
왼쪽 값 == 오른쪽 값 : 0 을 반환
왼쪽 값 < 오른쪽 값 : - (음수) 를 반환
왼쪽 값 > 오른쪽 값 : + (양수) 를 반환

collection 인터페이스는 크게 List, Set, Map 으로 구분
List, Set : 공통 부분이 많아서, collection 인터페이스를 정의할 수 있었음
Map : 조금 다른 구조를 가지고 있어, 같은 상속계층도에 포함하진 않음
Collection Framework의 모든 Collection 클래스들은 List, Set, Map 中 하나를 반드시 구현하고 있다!
세부적으로 여러 클래스가 해당 인터페이스를 구현하거나, 다른 인터페이스가 상속받는 구조로 되어있다.
주의! 구별하자
- Collection : 인터페이스
 
- Collcections : 클래스
 
- Collections.sort()
 
참고: Collections 클래스
1. 코드의 실행 결과?
import java.util.*;
class Ex {
	public static void main(String[] args) {
		ArrayList list = new ArrayList();		// 중복 허용, 저장순서 유지 -> 3, 6, 2, 2, 2, 7
		list.add(3);
		list.add(6);
		list.add(2);
		list.add(2);
		list.add(2);
		list.add(7);
        
		HashSet set = new HashSet(list);		// 중복 허용 X -> 3, 6, 2, 7
		TreeSet tset = new TreeSet(set);		// 오름차순으로 정렬 -> 2, 3, 6, 7
		Stack stack = new Stack();
		stack.addAll(tset);			// 2 부터 스택에 push
		while (!stack.empty())
			System.out.println(stack.pop());		// top에서부터 꺼낸다
	}
}
/* 출력 결과
7
6
3
2
*/
2. BanNoAscending클래스를 완성하여 ArrayList에 담긴 Student인스턴스들이 반(ban)과 번호(no) 로 오름차순 정렬되게 하시오.(반이 같은 경우 번호를 비교해서 정렬)
import java.util.*;
 
class Student {
    String name;
    int ban;
    int no;
    int kor;
    int eng;
    int math;
 
    Student(String name, int ban, int no, int kor, int eng, int math) {
        this.name = name;
        this.ban = ban;
        this.no = no;
        this.kor = kor;
        this.eng = eng;
        this.math = math;
    }
 
    int getTotal() {
        return kor + eng + math;
    }
 
    float getAverage() {
        return (int) ((getTotal() / 3f) * 10 + 0.5) / 10f;
    }
 
    public String toString() {
        return name + "," + ban + "," + no + "," + kor + "," + eng + "," 
        + math + "," + getTotal() + "," + getAverage();
    }
}
// 정답
class BanNoAscending implements Comparator {
    public int compare(Object o1, Object o2) {
		if (o1 instanceof Student && o2 instanceof Student) {
			Student s1 = (Student) o1;
			Student s2 = (Student) o2;
			int result = s1.ban - s2.ban;
			if (result == 0) {
				return s1.no - s2.no;
			}
			return result;
		}
	}
}
// ---
class Exercise11_7 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new Student("이자바", 2, 1, 70, 90, 70));
        list.add(new Student("안자바", 2, 2, 60, 100, 80));
        list.add(new Student("홍길동", 1, 3, 100, 100, 100));
        list.add(new Student("남궁성", 1, 1, 90, 70, 80));
        list.add(new Student("김자바", 1, 2, 80, 80, 90));
        Collections.sort(list, new BanNoAscending());
        Iterator it = list.iterator();
        while (it.hasNext())
            System.out.println(it.next());
    }
}
3. 빙고판은 1~30 사이의 숫자들로 만든 것인데, 숫자들의 위치가 잘 섞이지 않는다는 문제가 있다. 이러한 문제가 발생하는 이유와 이 문제를 개선하기 위한 방법을 설명하고, 이를 개선한 새로운 코드를 작성하시오.
import java.util.*;
class Exercise11_10 {
	public static void main(String[] args) {
		Set set = new HashSet();
		int[][] board = new int[5][5];
		for (int i = 0; set.size() < 25; i++) {
			set.add((int) (Math.random() * 30) + 1 + "");
		}
		Iterator it = set.iterator();
		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board[i].length; j++) {
				board[i][j] = Integer.parseInt((String) it.next());
				System.out.print((board[i][j] < 10 ? " " : "") + board[i][j]);
			}
			System.out.println();
		}
	}
}
// 정답
ArrayList list = new ArrayList(set);
Collections.shuffle(list);
참고: [JAVA] Java 컬렉션(Collection) 정리
참고: JAVA Collection Framework (1) - 컬렉션 프레임워크란?
참고: [JAVA] 컬렉션(Collection)이란?(추가 : Collecion의 요소 상세설명)
참고: [Java]컬렉션(Collections) 정리
참고: [java] HashMap에서 stream을 이용하여 정렬하는 법
참고: [Java] 자바 HashMap 사용법 & 예제 총정리
참고: [JAVA] HashMap의 개념 및 사용법 정리
참고: [JAVA] Map - getOrDefault 이란? 사용법 및 예제
참고: [Java] Map - getOrDefault 란? 사용법/예제
참고: [백준] 18258번 : 큐 2 - JAVA [자바]
참고: 자바의 정석 Chapter11 컬렉션 프레임 워크
참고: 링크드리스트, 더블링크드리스트, 더블서큘러링크드리스트 란?
참고: [Java] Iterator, hasNext() 와 next()
참고: [Java/자바] TreeSet 사용법