본문 바로가기
자료구조 & 알고리즘/알고리즘

자바 배열 정렬 (Comparable / Comparator 차이)

by 넬준 2021. 11. 12.

둘 다 "객체를 특정 기준으로 비교할 수 있도록 한다."

Comparable

- Comparable 인터페이스를 쓰려면 compareTo(T o) 구현

- 자기 자신과 매개변수 (T클래스 자료형 o) 객체를 비교

- lang패키지에 있어  import 필요 x

 

Comparator

- Comparator  인터페이스를 쓰려면  compare(T o1, T o2) 구현

- 두 매개변수 객체를 비교

- util패키지에 있어 import  필요

- Comparator  인터페이스를 구현하는 클래스는 비교하는 두 객체와 아무 관련이 없고,

  compare()만 overriding해서 비교할 때만 사용하려고 하는 것이다.

  그래서 Comparator을 구현하는 익명 객체를 생성하여 주로 사용한다.

- Comparator을 구현하는 익명 객체를 여러 개 생성하여 사용하면

  각각 다른 여러 기준으로 비교할 수 있다.

 

정렬

배열 정렬 메소드(Arrays.sort(), Collections.sort() 등)에서 해당 Interface를 사용한다.

Arrays.sort(배열)일 경우는 Comparable인터페이스를 구현한 클래스에서 overring한 compareTo() 기준으로,

Arrays.sort(배열, Comparator)일 경우는 Comparator 인터페이스를 구현한 클래스에서 overriding한 compare(o1, o2)의 기준으로 배열을 정렬한다.

 

배열의 요소가 수, 문자, 문자열 같은 경우 각 자료형이 Comparable을 상속받고 있고,

overriding한 compareTo()에 일반적인 비교 기준이 구현되어 있다. 

따라서 Arrays.sort(int형 배열), Arrays.sort(String형 배열)을 하면 일반적인 오름차순으로 배열이 정렬된다.

 

public class Soldier implements Comparable<Soldier> {
	String name;
	int age;
	int height;
	
	public Soldier(String name, int age, int height) {
		this.name = name;
		this.age = age;
		this.height = height;
	}
	
	@Override
	public int compareTo(Soldier o) {
		//기본적으로 정렬할 기준
		//이름 가나다 순 정렬
		return this.name.compareTo(o.name); //String형이 overriding한 compareTo()
	}
	
	@Override
	public String toString() {
		// 출력을 위한 overriding
		return "이름 : "+this.name+" / 나이 : "+this.age+" / 키 : "+this.height;
	}
}
import java.util.Arrays;
import java.util.Comparator;

public class ArraySortTest {
	
	private static Soldier[] soldiers;

	public static void main(String[] args) {
		
		soldiers = new Soldier[6];
		
		soldiers[0] = new Soldier("김민수", 20, 172);
		soldiers[1] = new Soldier("박철민", 18, 183);
		soldiers[2] = new Soldier("최공자", 21, 178);
		soldiers[3] = new Soldier("이준기", 19, 175);
		soldiers[4] = new Soldier("박정식", 24, 169);
		soldiers[5] = new Soldier("최빈이", 23, 188);
		
		System.out.println("정렬 전");
		System.out.println("---------------");
		for(Soldier soldier : soldiers) {
			System.out.println(soldier);
		}
		System.out.println();
		
		
		
		System.out.println("이름 순 정렬");
		System.out.println("---------------");
		
		//Soldier클래스에서 overriding한 compareTo()에 의해 정렬
		Arrays.sort(soldiers);
		
		for(Soldier soldier : soldiers) {
			System.out.println(soldier);
		}
		System.out.println();
		
		System.out.println("나이 순 정렬");
		System.out.println("---------------");
		
		//comp1을 기준으로 하여(나이) 배열 정렬
		Arrays.sort(soldiers, comp1);
		
		for(Soldier soldier : soldiers) {
			System.out.println(soldier);
		}
		System.out.println();
		
		System.out.println("키 순 정렬");
		System.out.println("---------------");
		
		//comp1을 기준으로 하여(나이) 배열 정렬
		Arrays.sort(soldiers, comp2);
		
		for(Soldier soldier : soldiers) {
			System.out.println(soldier);
		}
		System.out.println();
	
	}//main() end
	
	//나이 순 정렬을 위한 Comparator구현 익명 객체
	static Comparator<Soldier> comp1 = new Comparator<Soldier>() {
		@Override
		public int compare(Soldier soldier1, Soldier soldier2) {
			// 나이 순 정렬
			return soldier1.age - soldier2.age;
		}
	};
	
	//키 순 정렬을 위한 Comparator구현 익명 객체
	static Comparator<Soldier> comp2 = new Comparator<Soldier>() {
		@Override
		public int compare(Soldier soldier1, Soldier soldier2) {
        	//키 순 정렬
			return soldier1.height - soldier2.height;
		}
	};
}
정렬 전
---------------
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 박정식 / 나이 : 24 / 키 : 169
이름 : 최빈이 / 나이 : 23 / 키 : 188

이름 순 정렬
---------------
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 박정식 / 나이 : 24 / 키 : 169
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 최빈이 / 나이 : 23 / 키 : 188

나이 순 정렬
---------------
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 최빈이 / 나이 : 23 / 키 : 188
이름 : 박정식 / 나이 : 24 / 키 : 169

키 순 정렬
---------------
이름 : 박정식 / 나이 : 24 / 키 : 169
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 최빈이 / 나이 : 23 / 키 : 188

 

 

위 글은 아래 출처를 참고하여 작성하였습니다.

출처 : https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

 

'자료구조 & 알고리즘 > 알고리즘' 카테고리의 다른 글

병합 정렬  (0) 2021.11.20
셸 정렬  (0) 2021.11.19
삽입 정렬  (0) 2021.11.16
선택 정렬  (0) 2021.11.16
버블 정렬  (0) 2021.11.16

댓글