1. Collection 이란?
Collection 객체는 여러 원소들을 담을 수 있는 자료구조를 말한다. JCF(Java Collections Framework)는 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다. 다음은 Java 컬렉션 프레임워크의 상속구조를 나타낸다.
Map의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류된다.
2. Collection 인터페이스의 특징
2.1 Set 인터페이스
순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.
- HashSet
- 가장빠른 임의 접근 속도
- 순서를 예측할 수 없음 - TreeSet
- 정렬방법을 지정할 수 있음
2.2 List 인터페이스
순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
- LinkedList
- 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임 - Vector
- 과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음 - ArrayList
- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남
2.3 Map 인터페이스
키(Key), 값(Value)의 쌍으로 이루어진 데이터으 집합으로,
순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.
- Hashtable
- HashMap보다는 느리지만 동기화 지원
- null불가 - HashMap
- 중복과 순서가 허용되지 않으며 null값이 올 수 있다. - TreeMap
- 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름
3. Collection 인터페이스 주요 메소드
4. Collections.sort()
java.util.Collections 클래스의 static 메소드인 sort()를 이용해서 Collection을 정렬할 수 있다. API 문서를 보면 오버로딩 된 두개의 sort() 메소드를 볼 수 있다.
다음과 같은 Student 클래스가 있을때 정렬을 해본다고 생각하자.
class Test
{
public static void main (String[] args) throws java.lang.Exception
{
List<Student> list = new ArrayList<Student>();
list.add(new Student("a", 5));
list.add(new Student("b", 10));
list.add(new Student("c", 1));
list.add(new Student("d", 52));
list.add(new Student("e", 23));
Collections.sort(list);
/*
* error: no suitable method found for sort(List<Student>)
*/
}
}
class Student {
String name;
int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return this.name;
}
public int getScore() {
return this.score;
}
}
"error: no suitable method found for sort(List<Student>)"라는 에러와 함께 프로그램이 종료된다. 위의 코드에서 에러가 나는 이유는 Collections의 sort 메소드가 정렬하기 위한 기준을 찾을 수 없기 때문이다. 정렬 기준을 명시하기 위해서 2가지 방법이 있다.
- Comparable 인터페이스 구현
- Comparator 구현
Comparable 인터페이스 구현하여 정렬
class Student implements Comparable<Student> {
String name;
int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return this.name;
}
public int getScore() {
return this.score;
}
@Override
public int compareTo(Student s) {
if (this.score < s.getScore()) {
return -1;
} else if (this.score > s.getScore()) {
return 1;
}
return 0;
}
}
현재 멤버 변수의 값이 파라미터로 넘어온 값보다 작으면 음수, 같으면 0, 크면 양수를 리턴해주도록 작성하면 된다.
Comparator 구현
Collections.sort 메소드는 2번째 인자로 Comparator 인터페이스를 받을 수 있다. Comparator 인터페이스의 compare 메소드를 오버라이드 하면 된다. 내림차순 정렬을 할 경우에는 s1과 s2의 위치를 바꿔주면 된다. 또한 compareTo() 메소드를 사용하면 if문없이도 구현이 가능하다. 내림차순으로 정렬을 원할 경우 s2의 score에 s1의 score를 빼주고, 오름차순으로 정렬할경우 s1의 score에서 s2의 score를 빼준다.
class Test
{
public static void main (String[] args) throws java.lang.Exception
{
List<Student> list = new ArrayList<Student>();
list.add(new Student("a", 5));
list.add(new Student("b", 10));
list.add(new Student("c", 1));
list.add(new Student("d", 52));
list.add(new Student("e", 23));
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
if (s1.getScore() < s2.getScore()) {
return -1;
} else if (s1.getScore() > s2.getScore()) {
return 1;
}
return 0;
}
});
/*
* 결과
* 1
* 5
* 10
* 23
* 52
*/
for (Student s : list) {
System.out.println(s.getScore());
}
}
}
class Student {
String name;
int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return this.name;
}
public int getScore() {
return this.score;
}
}
REFERENCE
https://gangnam-americano.tistory.com/41
'Java' 카테고리의 다른 글
JVM Stack & Heap (0) | 2021.01.17 |
---|---|
[Java] Comparable과 Comparator을 이용한 정렬 (0) | 2020.07.19 |
[Java] 객체 값 복사 - clone() 예제 (0) | 2020.05.31 |
[Java-source quality] Redundant Modifier (0) | 2020.05.29 |
[Java] JAVA API 도큐먼트 (0) | 2020.04.03 |