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 사용법