자바 Comparable, Comparator 사용법

큰모래·2022년 12월 19일
0

정의

Comparable

자기 자신과 매개변수 객체를 비교하는 것

Comparator

두 매개변수 객체를 비교하는 것


사용법

Comparable

public class ClassName implements Comparable<T>
//코드
	public int compareTo(T object) {
    	//비교 코드 구현
    }

Comparable 인터페이스를 상속받는 클래스를 구현하고
그 클래스의 메서드로 compareTo()를 필수로 구현해야 한다.
compareTo()가 객체를 비교할 기준을 정의해주는 부분이다.

class Student implements Comparable<Student> {
	
    int age;
    int classNumber;
    
    Student(int age, int classNumber) {
    	this.age = age;
        this.classNumber = classNumber;
    }
    
    @Override
    public int compareTo(Student son) {
    	
        // 자기 자신의 나이가 son의 나이보다 큰 경우 양수
        if(this.age > son.age) {
        	return 1;
        }
        
        // 자기 자신의 나이가 son의 나이와 같다면 0
        else if(this.age == son.age) {
        	return 0;
        }
        
        // 자기 자신의 나이가 son의 나이보다 작으면 음수
        else {
        	return -1;
        }
    }

꼭 반환값이 1,0,-1이 아니여도 상관없음.
반환값이 양수,음수,0이면 비교가 가능하다.

@Override

public int compareTo(Student son) {

	return this.age - son.age;
}
  • 주의 사항
    연산 과정에서 오버플로우나 언더플로우가 나는지 꼭 확인할 것!!!!

Comparator

자기 자신을 비교하는 것이 아닌 파라미터로 들어온 두 객체를 비교한다.

import java.util.Comparator;

public class ClassName implements Comparator<T> {
// 코드
	public int compare(T object1, T object2) {
    	// 비교 연산
    }
}

객체 비교 연산 부분인 compare() 메서드를 필수 구현해야 한다.

import java.util.Comparator;

public class Student implements Comparator<Student> {
	int age;
    int classNumber;
    
    Student(int age, int classNumber) {
    	this.age = age;
        this.classNumber = classNumber;
    }
    
    @Override
	public int compare(Student son, Student kang) {
    	if(son.classNumber > kang.classNumber) {
        	return 1;
        }
        
        else if(son.classNumber == kang.classNumber {
        	return 0;
        
        else {
        	return -1
        }
    }
}

Comparable 과 마찬가지로 compare 메서드를 간략하게 가능하다.

@Override
public int compare(Student o1, Student o2) {

	return o1.classNumber - o2.classNumber;
}

또한, `Comparable` 과 마찬가지로 언더플로우와 오버플로우에 유의해야 한다.

활용

실제로 알고리즘 문제를 풀때는 Comparator<>의 기능만 사용하고 싶은 경우가 많기 때문에 익명 객체를 만들어 기능을 구현한다.

익명객체를 가리키는 변수명만 바꾸면 몇개든 자유롭게 생성할 수 있고
다양한 비교 기준을 만들 수 있다.

Comparator<Student> test = new Comparator<Student>() {
		@Override
		public int compare(Student o1, Student o2) {
		return o1.classNumber - o2.classNumber;
		}
};

만약, 다양한 문자열이 담긴 배열이 존재하는데 이 배열을 문자열의 길이 순으로 정렬하고 싶다면??

String [] str = {abcd, ab, a, abcdef};

Arrays.sort(str, new Comparator<String>() {
	public int compare(String o1, String o2) {
    
    	return o1.length()-o2.length();
    }
});

//결과값 : str = {a,ab,abcd,abcdef}

compare 메서드의 두 원소 간의 길이 차를 반환값으로 한다.

profile
큰모래

0개의 댓글