Whiteship's Note


Comparator를 사용하여 비교하기.

Java : 2006.11.02 16:07


이 전글에서 보았던 Arrays.sort()와 Collection.sort() 메소드에는 공통적으로 Comparator를 추가적으로 인자로 받아들이는 메소드들이 있습니다.

public static <T> void sort(T[] a, Comparator<? super T> c)  <- Arrays 클래스에 있는 메소드

public static <T> void sort(List<T> list, Comparator<? super T> c) <- Collections 클래스에 있는 메소드.

sort를 할 때 보통은 Comparator는 주지 않고 정렬할 대상만을 전해 줍니다. 그렇게 전달 받은 대상의 타입이 Comparable 인터페이스를 구현하지 않았다면 컴파일 에러가 발생합니다. 이 부분은 Agile Java에도 나와 있지요.( Session 클래스가 Comparable 인터페이스를 구현하지 않은 채 Collection.sort(sessions) 와 같은 호출을 하여 에러가 발생하여 이 문제를 해결한 적이 있습니다.)

하지만 위의 방식대로 했을 때 발생할 수 있는 문제는.. 만약에 Student를 이름으로 정렬하지 않고 학번으로 정렬하고 싶다면 어떻게 하느냐 입니다. 즉 정렬을 하는 알고리즘만 살짝 바뀔 뿐인데 그렇다고 Comrable 인터페이스에 있는 comareTo() 메소드 안에 계속 if문을 심어 넣으면 변화에 닫혀있지 않는 코드가 되는 것입니다. 새로운 정렬 알고리즘은 추가 되고(확장에 열려있고 Opended) 소스코드의 변화는 최소화 하는(변화에 닫혀있는 Closed) OCP를 달성하려면  Strategy Pattern을 사용하여 문제를 해결 할 수도 있겠습니다. 그리고 이런한 문제를 엔터프라이즈 수업 과제로 다룬적이 있었습니다.

Comparator 인터페이스를 구현한 클래스들을 만들고 이것을 sort 메소드의 인자로 넘겨주면 Comparator의 compare 메소드를 사용하여 두 원소를 비교하게 됩니다.

Method Summary
intcompare(T o1, T o2)
         Compares its two arguments for order.
booleanequals(Object obj)
         Indicates whether some other object is "equal to" this Comparator.

Comparator 인터페이스에 있는 메소드 입니다.

예를 들어 학생의 이름으로 정렬하는 Comparator를 만들고 싶다면 이 인터페이스를 구현하면 됩니다.

public class NameComparator implements Comparator<Student> {
   public int compare(Student s1, Student s2){
      return s1.getName().compareTo(s2.getName());
   }
}

이렇게 구현 해두고.. 이제 정렬을 할때

Collection.sort(students, NameComparator);

이렇게 호출을 하면 Student가 Comparable을 구현하고 compareTo에서 학번으로 비교를 한다고 해도 그 메소드는 무시되고 이름으로 정렬하게 됩니다.

'Java' 카테고리의 다른 글

Auto (un)boxing은 -128~127  (4) 2006.11.07
탬플릿 클레스 만들기  (3) 2006.11.05
local inner class의 예  (0) 2006.11.05
객체지향의 구멍 static  (0) 2006.11.04
i++와 i=i+1 속도 비교  (0) 2006.11.02
Comparator를 사용하여 비교하기.  (0) 2006.11.02
Arrays.sort() & Collections.sort()  (2) 2006.11.02
What is Object?  (12) 2006.11.01
Agile Java 2장 연습문제 풀기  (2) 2006.10.29
Lazy Initialization 언제 사용 해야 될까요?  (9) 2006.10.28
Agile Java 1장 연습문제 풀기  (2) 2006.10.27
top


Arrays.sort() & Collections.sort()

Java : 2006.11.02 12:31


sorting을 할 때는 배열을 정렬할 것인지 collection을 정렬할 것인지에 따라 사용하는 클래스가 달라집니다. 메소드 이름은 sorting으로 같지요.

먼저 배열을 정렬할 때는 Arrays.sort(numbers); 같은 식으로 하면 됩니다.

여기 있는 메소드들이 Arrays 클래스에 있는 sort라는 이름을 가진 메소드 목록입니다. 배열은 객체가 아니더군요. 그래서 Arrays 클래스가 배열이 객체라면 해줄 행동들을 대신 해줍니다.

그리고 List 타입을 정렬하고자 할 때는 Collections.sort(List 타입의 변수); 같은 식으로 사용하면 됩니다.


List 타입이라고 하면 ArrayList, LinkedList, Vector들 중 하나라고 할 수 있겠습니다. 이 들 간의 상속 구조는 다음과 같습니다.


겉으로 보기에는 둘이 차이가 나고 있지만 사실 소스코드를 보면 Collections.sort() 메소드는Arrays.sort()를 사용하고 있습니다.

Collections.sort() 메소드 소스코드 보기

more..


따라서 결국 Collection들이 배열을 기반으로 구현되었으며 그래서 정렬을 할 때도 내부적으로 배열을 사용하여 정렬하고 있는 것이라고 생각할 수 있겠습니다.

'Java' 카테고리의 다른 글

탬플릿 클레스 만들기  (3) 2006.11.05
local inner class의 예  (0) 2006.11.05
객체지향의 구멍 static  (0) 2006.11.04
i++와 i=i+1 속도 비교  (0) 2006.11.02
Comparator를 사용하여 비교하기.  (0) 2006.11.02
Arrays.sort() & Collections.sort()  (2) 2006.11.02
What is Object?  (12) 2006.11.01
Agile Java 2장 연습문제 풀기  (2) 2006.10.29
Lazy Initialization 언제 사용 해야 될까요?  (9) 2006.10.28
Agile Java 1장 연습문제 풀기  (2) 2006.10.27
JUnit 3.8 과 JUnit 4의 차이  (0) 2006.10.27
top