<본 글은 본인의 공부를 위해서 포스팅한 내용입니다. 이해도가 다소 떨어질 수 있으니 양해부탁드립니다.>
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Family {
int rank;
String name;
int age;
Family(int rank, String name, int age){
this.rank = rank;
this.name = name;
this.age = age;
}
}
|
cs |
Family라는 Class를 만들었습니다.
그런데 저는 이 Family로 생성한 객체들간에 (제가 만든 기준으로) 비교를 시켜서 정렬을 하고 싶습니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.util.Arrays;
public class 테스트하는곳 {
public static void main(String[] args) {
int[] numbers = {9,5,4,3,6,8,7,0,1,2};
Arrays.sort(numbers);
System.out.println("결과 : "+Arrays.toString(numbers));
// 결과 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}
}
|
cs |
위 코드 처럼 기본타입의 배열이 있을때, Arrays클래스의 sort메서드를 사용하면 0,1,2,3...이렇게 오름차순으로 알아서 정렬을 해주겠지만 제가 만든 Class는 별도로 기준이 존재하지 않습니다. 그래서 제가 만든 Class안의 인스턴스 변수들을활용해서 기준을 만들어준다면 제가 원하는 대로 정렬을 할 수 있습니다. 사실 이렇게 Arrays.sort를 하였을때 정렬이 되는 이유는 compareto라는 메서드를 갖고 있기 때문인데요. 그렇기 때문에 comparable이라는 인터페이스를 받아서 구현해야 합니다. comparable(인터페이스)는 compareto(추상메서드)를 갖고 있습니다. 바로 이 인터페이스와 추상메서드를 지금부터 활용해보도록 하겠습니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public class Family implements Comparable<Family>{
int rank;
String name;
int age;
Family(int rank, String name, int age){
this.rank = rank;
this.name = name;
this.age = age;
}
@Override
public int compareTo(Family f) {
int diff = rank - f.rank;
// A.compareTo(B)의 결과가 양수이면
// Arrays.sort(배열객체)의 결과가 "오름차순",
//음수이면 "내림차순" 입니다.
if(diff == 0) {
diff = (age - f.age)*-1;
}if(diff == 0) {
diff = name.compareTo(f.name); //이름도 오름차순으로 정렬;
}
return diff;
}
@Override
public String toString() {
return "<rank=" + rank + ", name=" + name + ", age=" + age + ">";
}
}
|
cs |
Family 클래스는 위처럼 comparable인터페이스를 구현하였습니다. 그리고 compareto메서드를 만들었습니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import java.util.Arrays;
public class 테스트하는곳 {
public static void main(String[] args) {
Family[] familyList = new Family[7];
//가족이 7명이기 때문에 7개의 객체가 들어 갈 수 있는 Family배열을 만들었습니다.
familyList[0] = new Family(2,"큰누나",30);
familyList[1] = new Family(2,"작은누나",29);
familyList[2] = new Family(1,"엄마",55);
familyList[3] = new Family(3,"아빠",60);
familyList[4] = new Family(4,"첫째동생",22); //첫째와 둘째 동생은 쌍둥이입니다.
familyList[5] = new Family(4,"둘째동생",22);
familyList[6] = new Family(5,"나",25);
//compareto메서드를 다음과 같이 작성했습니다.
//먼저 rank 숫자가 작은순(오름차순)으로 정렬하고
//그 다음 age가 큰 순으로(내림차순)으로 정렬하였고
//마지막으로 rank와 age가 같을때, 이름순서를 String에 있는 compareto로 비교하도록 하였습니다.
Arrays.sort(familyList);
System.out.println(Arrays.toString(familyList));
// 결과 :
// [<rank=1, name=엄마, age=55>
// <rank=2, name=큰누나, age=30>,
// <rank=2, name=작은누나, age=29>,
// <rank=3, name=아빠, age=60>,
// <rank=4, name=둘째동생, age=22>,
// <rank=4, name=첫째동생, age=22>,
// <rank=5, name=나, age=25>]
}
}
|
cs |
그 결과 위처럼 나옵니다. 마지막으로 Comparator 인터페이스를 구현하여 정렬하도록 해보겠습니다.
새로운 클래스를 하나 만듭니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.util.Comparator;
public class ReverseFamily implements Comparator<Family>{
@Override
public int compare(Family f1, Family f2) {
int diff = (f1.rank-f2.rank)*-1; //rank 내림차순(5,4,3,2,1)
if(diff == 0) {
diff = f1.age-f2.age; //나이 오름차순(1,2,3,4,5)
}
if(diff == 0) {
diff = -1*(f1.name.compareTo(f2.name)); //이름 내림차순(ㅎ,ㅍ,ㅌ,ㅋ,ㅊ)
}
return diff;
}
}
|
cs |
위와 같이 Comparator라는 인터페이스를 구현하여 ReverseFamily라는 클래스를 만들었습니다. 기준을 갖고 있는 클래스 입니다. 그럼 마지막으로 실행결과를 보여드릴게요.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
import java.util.Arrays;
public class 테스트하는곳 {
public static void main(String[] args) {
Family[] familyList = new Family[7];
//가족이 7명이기 때문에 7개의 객체가 들어 갈 수 있는 Family배열을 만들었습니다.
familyList[0] = new Family(2,"큰누나",30);
familyList[1] = new Family(2,"작은누나",29);
familyList[2] = new Family(1,"엄마",55);
familyList[3] = new Family(3,"아빠",60);
familyList[4] = new Family(4,"첫째동생",22); //첫째와 둘째 동생은 쌍둥이입니다.
familyList[5] = new Family(4,"둘째동생",22);
familyList[6] = new Family(5,"나",25);
//compareto메서드를 다음과 같이 작성했습니다.
//먼저 rank 숫자가 작은순(오름차순)으로 정렬하고
//그 다음 age가 큰 순으로(내림차순)으로 정렬하였고
//마지막으로 rank와 age가 같을때, 이름순서를 String에 있는 compareto로 비교하도록 하였습니다.
Arrays.sort(familyList);
System.out.println(Arrays.toString(familyList));
// 결과 :
// [<rank=1, name=엄마, age=55>
// <rank=2, name=큰누나, age=30>,
// <rank=2, name=작은누나, age=29>,
// <rank=3, name=아빠, age=60>,
// <rank=4, name=둘째동생, age=22>,
// <rank=4, name=첫째동생, age=22>,
// <rank=5, name=나, age=25>]
Arrays.sort(familyList,new ReverseFamily());
//위의 기준과 반대로 정렬하는 Class 작성
// 그때 새로운 ReverseFamily라는 클래스를 만들고
// comparator라는 인터페이스를 구현함.
// comparable(인터페이스)는 compareto(메서드)
// comparator(인터페이스)는 compare(메서드)
System.out.println(Arrays.toString(familyList));
// 결과:
// <rank=5, name=나, age=25>,
// <rank=4, name=첫째동생, age=22>,
// <rank=4, name=둘째동생, age=22>,
// <rank=3, name=아빠, age=60>,
// <rank=2, name=작은누나, age=29>,
// <rank=2, name=큰누나, age=30>,
// <rank=1, name=엄마, age=55>]
}
}
|
cs |
이상입니다.