728x90
Comparable은 정렬 기준을 구현하는데 사용
Comparator는 다른 기준으로 정렬하고자 할때 사용
그럼 어떤 기준으로 sort하는 것일까?
comparable은 인터페이스이고 compareTo() 메소드가 정의되어 있기 때문에
사용자 정의 클래스에서는 이 메소드를 오버라이딩하여 다음과 같이 리턴값을 만들어 내야 한다.
리턴타입 | 메소드 | 설명 |
int | compareTo(T o) | 주어진 객체와 같으면 0을 리턴 주어진 객체보다 적으면 음수 리턴 주어진 객체보다 크면 양수리턴 |
Comparator도 인터페이스 이고
리턴타입 | 메소드 | 설명 |
int | compare(T o1, T o2) | o1과 o2가 동등하다면 0리턴 o1이 o2보다 앞에 오게하려면 음수리턴 o1이 o2보다 뒤에 오게 하려면 양수리턴 |
sort() 정렬하는 메소드
sort()는 배열을 정렬해주는 메소드이다 오름차순?으로 하고 문자는 아스키코드를 기준으로 정렬해준다. 0과 1, 1과2 이렇게 하나씩 비교를해서 앞에객체(기준)보다 음수, 양수, 0을 리턴해서 자리를 하나씩 옮겨준다. |
|
Collection 클래스의 sort메소드를 사용하기 위해서는 Comparable 와 Comparator 중 하나를 선택해서 사용해야 한다. 그리고 정렬을 하는 기준을 개발자가 직접 정해줘야 한다. 먼저 Comparable 은 객체의 정보를 저장한 DTO클래스에 implement를 해줘야 한다. |
|
사진처럼 추상클래스 Comparable를 implement하고 메소드를 오버라이드 한다. 그리고 개발자가 원하는 기준을 정의하면된다. 사진에서는 총점 tot를 기준으로 잡았다. 위의 설명처럼 주어진 객체와 같으면 0을 리턴 주어진 객체보다 적으면 음수 리턴 주어진 객체보다 크면 양수를 리턴한다. 배열의 0번째 총점(this.tot)를 1번째 총점(s,tot)와 비교해서 결과를 낸다. 그다음 1번째와 2번째를 비교한다. 이렇게 기준점을 주면 나오는 결과로 sort메소드가 자동으로 정렬을 할 것이다. |
|
그리고 메소드를 구현할 클래스의 부분에 오버라이드를 하고 사진과 같이 선언한다. 파라미터 값으로는 배열을 뜻하는 변수를 넣으면 된다. |
|
다른 예시를 보자 | |
이 클래스에서는 나이age를 기준으로 잡았다. 첫번째 예시에서는 3항 연산자를 했는데 여기선 풀어서 if문으로 했다. 0번째 배열속의 age와 1번째의 age를 비교해서 -1,0,1을 리턴시킨다. 그다음 순서대로 쭉이어나가고 그 결과에 맞에 sort메소드가 알아서 정렬해준다. 오름차순 내림차순은 보고 생각해보자. |
|
그리고 1번 처럼 선언하면 자동으로 정렬한다. 근데 2번을 보면 Comparator가 있다. 저 클래스에서 Comparator 를 사용한 이유는 나이가 아닌 다른 기준으로 정렬을 하고 싶어서 만든것이다. 오버라이드를 통해 기준을 재정의 함으로써 기준을 바꿀 수 있다. 익명클래스를 이용해서 사용한다. Comparator<PersonDTO> com PersonDTO클래스의 정보를 바탕으로 하는 Comparator메소드를 com이라는 임의의 변수로 선언했다. 그리고 오버라이드 한것을 보면 위의 사진들과 다르게 파라미터를 2개를 받는데 맨위에 설명이 있다 p1과 p2가 동등하다면 0리턴 p1이 p2보다 앞에 오게하려면 음수리턴 p1이 p2보다 뒤에 오게 하려면 양수리턴 동작원리는 똑같다, 사진처럼 코드를 작성하면 |
|
이런 결과가 나온다. 이름으로 정렬한 것은 아스키코드를 기준으로 정렬한다. |
728x90