자바 기본 문법 정리 (interface : Comparable과 Comparator)
오늘은 interface Comparable과 Comparator에 대한 활용 법과 정의에 대하여 알아보겠습니다!!
두 인터페이스를 통하여 객체를 정렬할 수 있답니다!!
이를 통하여 객체를 비교할 수 있게 하여 다양한 활용이 가능합니다.
primitive 타입의 실수 변수(byte, int, double 등등..)의 경우 부등호를 갖고 쉽게 두 변수를 비교 할 수 있지만
객체의 경우 따로 용자가 기준을 정해주지 않는 이상 어떤 객체가 더 높은 우선순위를 갖는지 판단이 어렵습니다.
이러한 문제점을 해결하는 것이 바로 Comparable 또는 Comparator라고 합니다.
1. Comparable
: 자기 자신과 매개변수 객체를 비교
✅ Arrays.sort (객체배열), Collections.sort(Collection)
함수를 통해 정렬할 때 어떤 기준으로 정렬할지 compareTo()로 지정하기 위한 interface
정렬하려는 객체의 클래스에서 Comparable를 상속받는다..
* ex) Employee 객체들을 정렬하기 위해서는 Employee 클래스에 Comparable 선언한다.
* 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 o) {
}
}
- 자기자신과 매개변수와의 차이를 통하여 오름차순 , 내림차순을 결정
- 오름 차순 정렬
-비교할 값이 비교 대상 보다 크면 양수, 같으면 0, 작으면 음수를 리턴한다.
- 현재 객체 - 인자로 전달된 객체
**주의!!!! 오름 차수 정렬 syudent가 음수 일때는 오버 플로우 발생
- 내림 차순 정렬
- 비교할 값이 비교 대상 보다 크면 음수, 같으면 0, 작으면 양수를 리턴한다.
인자로 전달된 객체 - 현재 객체
// 오름차순
public int compareTo(Student o) {
if(this.age > o.age) {
return 1;
}
else if(this.age == o.age) {
return 0;
}
else {
return -1;
//return age - o.age;
//return Integer.compare(age, o.age);
//내림차순
//if(age> o.age)return -1 ;
//else if (age == o.age)return 0;
//else return 1;
//return o.age - age;
//return Integer.compare(o.age, age);
2. Comparator
: 자기 자신과 매개변수를 비교 , compareTo 메소드 반드시 구현
✅ Arrays.sort(객체배열, Comparator), Collections.sort(Collection, Comparator)
함수를 통해 정렬할 때 어떤 기준으로 정렬할지 compare()로 지정하기 위한 interface
- sort() 함수의 두번째 인자로 Comparator를 전달한다.
public class ComparableTest {
public static void main(String[] args) {
Employee[] emps = {
new Employee("1", "1", 5),
new Employee("1", "1", 1),
new Employee("1", "1", 2),
};
// 기본타입을 내림 차순으로 정렬
// comparator를 두번째 인자로 전달해야 한다
// =>comparator의 compare 함수는 객체만 전달 받는다.
// =>Wrapper를 이용해ㅇ야 한다.*/
Integer[]array2 = {5,2,4,1,7};
Arrays.sort(array2,new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
//내림 차순
return o2-21;
}
3. 람다
() ->{ }
() : 인자가 없거나 두개 이상일때 반드시 소괄호로 인자를 표시한다.
{ } : 문장이 2문장 이상일 때 사용한다.
public class ComparableTest2 {
public static void main(String[] args) {
Employee[] emps = {
new Employee("2", "1", 5),
new Employee("1", "1", 1),
new Employee("3", "1", 2),
};
//내림 차순 정리
Integer[] array2 = {5, 1, 7, 2};
Arrays.sort(array2, (a, b) -> { return b-a;});
System.out.println(Arrays.toString(array2));
Arrays.sort(emps, (a, b) -> { return b.getEmpno().compareTo(a.getEmpno());});
System.out.println(Arrays.toString(emps));
* 정렬의 방식은 comparable comparator 람다 형식 중 원하는 형식 사용!!!!
4. Wrapper : 자바의 기본타입(Primitive)을 객체로 사용할 수 있도록 제공하는 클래스
* byte => Byte
* short => Short
* char => Character
* int => Integer
* long => Long
* float => Float
* double => Double
* boolean => Boolean
- parseXXX(String)
인자로 전달된 문자열을 해당 Wrapper의 Format으로 변경하는 함수
* 주의점 format 이 맞지 않는 경우 NumberFormatException 발생
ex) Integer.parseInt("3.14") Integer.parseInt("a")
- Character의 isXXXX('')
인자로 전달된 문자가 해당 타입인지 검사하는 함수
ex) Character.isDigit('1')