본문 바로가기
Java

[JAVA]Comparable<T>,Comparator<T> 인터페이스

by 인포썸 2020. 6. 8.

자바에서는 배열,리스트를 정렬하기 위해 Comparable,Comparator라는 두가지 인터페이스를 제공한다.

 

Comparable - 이 인터페이스를 구현한 객체 스스로에게 부여하는 한 가지 기본 정렬 규칙을 설정하는 목적으로 사용한다.(보통 작은수에서 큰수로, 알파벳 순서대로, 가나다 순서대로 정렬한다.)

 

Comparator - 이 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미하며, 기본 정렬 규칙과 다르게 원하는대로 정렬순서를 지정하고 싶을 때 사용한다.

 

배열의 경우 정렬을 할 때 Arrays 클래스의 sort()메서드를 이용하여 정렬한다. 

int,String값은 오름차순 정렬이 잘 되지만, 객체를 만들고 나서, sort()를 쓰면 


java.lang.ClassCastException: 객체이름 cannot be cast to java.lang.Comparable
에러가 나온다. Comparable에서 객체를 캐스팅할 수가 없다는 오류이다.

 

그 때, Comparable의 compareTo()메소드를 오버라이딩해서 내가 원하는 순서대로 정렬을 커스텀할 수 있다.

class Car implements Comparable<Car>{
	private String name;
    private int price;
    
     public Friend(String name, int price) {
            super();
            this.name = name;
            this.age = price;
 	}
    @Override
     public int compareTo(Car o) {
            return this.price - o.price; //가격 내림차순
        }    
    }
    
    
    public static void main(String[] args) {

        Car car01 = new Car("아반떼", 3000);

        Car car02 = new Car("소나타", 2000);

 

        System.out.println(car01.compareTo(car02));

    }



 

위 코드는 Car라는 객체의 가격 내림차순으로 정렬해서 보여준다. Car클래스가 Comparable인터페이스를 implements받아 compareTo메소드를 오버라이드해서 가격 내림차 순으로 설정해주었다.

 

List의 경우는 Arrays가 아니라 Collections의 sort()메소드를 이용하여 정렬한다.

class Car implements Comparable<Car>{
	private String name;
    private int price;
    
     public Friend(String name, int price) {
            super();
            this.name = name;
            this.age = price;
 	}
 }
 
 class SortCarByNameInAsc implements Comparator<Car>{
 	@Override
    public int compare(Car c1,Car c2){
    return c2.name.compareTo(c1.name)
    }
 }
    
    
    public static void main(String[] args) {

        
        Car car01 = new Car("아반떼", 3000);

        Car car02 = new Car("소나타", 2000);

     List<Car> list = new ArrayList<Car>();
     
     list.add(car01);
     list.add(car02);
     
      Collections.sort(list, new SortCarByNameInAsc());
		
        System.out.println(list.get(0)+","+list.get(01));

    }



 

 

위 코드에서는 SortCarByNameInAsc라는 클래스를 Comparator 인터페이스를 implements받아 compare메소드를 오버라이드해서 정렬할 방법을 설정해주었다. compare는 비교할 두 개의 매개변수가 필요하다.

'Java' 카테고리의 다른 글

[JAVA]컬렉션(Collection)  (0) 2020.06.05

댓글