Whiteship's Note


Comparator를 사용하여 비교하기.

Java : 2006. 11. 2. 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()  (3) 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

Write a comment.


Arrays.sort() & Collections.sort()

Java : 2006. 11. 2. 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() 메소드 소스코드 보기

따라서 결국 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()  (3) 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

  1. Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.05 00:02 신고 PERM. MOD/DEL REPLY

    본문에 나오는 "배열은 객체가 아니더군요." 이 말은 아마 Agile Java의 어떤 부분을 보고 나서 충격을 먹고 (그 전까지 배열을 객체로 알고 있었거든요.) 써 넣은 부분인데..

    오늘 다시 어떤 글을 읽다보니 배열은 객체라는 말을 보게 되었습니다. Java Tutorial좀 보고 오겠습니다.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.05 00:06 신고 PERM MOD/DEL

    An array is a container object that holds a fixed number of values of a single type.

    http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html

    여기 첫 문장에 나오는 군요. 다행입니다. 기존에 알고 있던데로 배열은 객체가 맞는 듯 합니다.

  2. 개발자진입중 2019.12.03 16:45 PERM. MOD/DEL REPLY

    둘의 관계가 궁금했는데 감사합니다!

Write a comment.