본문 바로가기

카테고리 없음

Comparable Comparator 요약

객체 정렬 기준의 필요성

단순한 문자나 무낮와 같은 기본형 데이터는 기본적으로 대 소 비교 개념이 있다.

'1' 은 '2' 보다 크며 'A' 보다는 'B'가 크다는 것을 기준으로 자바는 이런 통념에 따라 정렬을 해준다.

하지만 특정 타입의 객체는 기본형 데이터와 달리 정렬 기준이 없으면 정렬을 할 수가 없다.

따라서 정렬 기준을 정의하여 알려주어야 한다.

Comparable 인터페이스 : java.lang.Comparable

정렬 수행시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의해 놓는 인터페이스이다.

Comparable 인터페이스를 implements 하고나서, 내부에 있는 compareTo 메서드를 호출하여

원하는 정렬 기준(오름차순, 내림차순)대로 구현하여 사용할 수 있다.

자바에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.

정렬시에 Comparable의 구현 내용에 맞춰 정렬이 수행된다.

Integer, Double 등의 클래스의 경우 비 내림차순(오름차순과 유사),

String 클래스의 경우 사전순으로 정렬되게 구현되어 있다.

만일 Comparable이 구현되지 않은 상태에서 Arrays.sort()를 이용하여 정렬을 수행하려 하면

cannot be cast to java.lang.Comparable 오류가 뜨게된다.

이유는 Arrays.sort() 등 정렬 메서드들은 정렬 시 자동으로 Comparable에 구현되어있는 compareTo() 메서드를

호출해서 사용하기 때문이다.

Comparator 클래스 : java.util.Comparator

정렬 가능한 클래스(=Comparable이 구현된 클래스)들의 기본 정렬 기준과는 다른 방식으로 정렬하고 싶을 때 사용하는 클래스이다.

Comparator 클래스를 생성하여, 내부에 compare메서드를 원하는 정렬 기준대로 구현하여 사용할 수 있다.

ex) 학번을 내림차순으로 학생들을 Comparable을 이용하여 순차적으로 정렬을 하였다.

이 중에서 성적이 가장 높은 2명을 간추려 장학금을 지급하려 한다.

예외적으로 성적이 같은 사람이 있다면, 학번이 빠른 순서로 장학금을 지급한다.

우선 성적이 높은 순으로 정렬을 해야한다.

하지만 이미 학번오름차순으로 이미 정렬을 했다.

그래서 기존과는 다른 새로운 정렬 기준을 세워야 한다.

이때 이용하는것이 Comparator 이다.

새로운 정렬기준: 학점 내림차순 & 같으면 학번 오름차순