[Java] 사용자 정의 비교 객체

·2024년 4월 17일
1

Comparable

단일 타입으로 이루어진 리스트의 경우, Comparator, Comparable을 재정의 하지 않아도 그대로 갖다 쓸 수 있었다.
하지만 객체는 여러 프로퍼티를 가지고 있기에 이런 비교 객체를 따로 재정의 함으로써
비교 기준을 만들어줘야 한다.


import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.util.Comparator;

import static java.lang.Math.min;

// 롬복 적용

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Student implements Comparable<Student> {
    private String name;
    private int studentNo;
    private String grade;



    @Override
    public int compareTo(Student o) {
        return o.getName().compareTo(this.name)*-1; //오름차순
    }
}

이 때 사용자 정의 비교를 위해서는 Comparator객체를 만들어야 하는데,
1개를 기준으로 비교하는 경우 compareTo을
2개를 기준으로 비교하는 경우 compare을 재정의하면 된다.

comparable

1개를 기준으로 비교하는 만큼, 비교하려는 객체 안에서 재정의를 시켜줘야한다.
즉 오버라이딩이 한번밖에 불가능한 만큼
=> 기준 객체가 고정된 경우 사용하면 좋다.

///student.java
public class Student implements Comparable<Student>

우선 Comparable< T >를 통해 구현체를 만들어주고,

@Override
    public int compareTo(Student o) {
        return o.getName().compareTo(this.name)*-1; //오름차순
    }

compareTo를 오버라이딩하여 비교 시 기준을 만들어준다.

comparator

comparator을 사용하기 위해서는 comapare을 오버라이딩 해야한다.

따로 서비스 파일 내에 Comparator 구현체 클래스를 만들어준다.
즉 비교 객체를 여러개 만들 수 있는만큼
=> 기준 객체가 여러개인 경우 사용하면 좋다.

//StudentService.java
class StudentNoComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        if(o1.getStudentNo()>o2.getStudentNo()) return 1;
        //f리턴이 양수라면 o1,o2자리 변경
        else if(o1.getStudentNo()<o2.getStudentNo())return -1;
        return 0;//변경XXX
    }
}

참고로 a<b 일 때 1을 리턴하게 되면 정렬 시 순서가 바뀌게 된다. b, a로 나타나진다는 말

public class Ex01Sort {
    public static void main(String[] args) {
    
    	List<Student> studentList = new ArrayList<Student>();
        studentList.add(new Student("it",28,"Junior"));
        studentList.add(new Student("java",20,"Expert"));
        studentList.add(new Student("dev",1002,"Junior"));

    	studentList.sort(new StudentNoComparator());
        studentList.sort(Comparator.naturalOrder());
        //Comparable을 학생번호를 기준으로 정의했기 때문에 이제 기준점(학생번호) 가 생김
        System.out.println("학생이름(오름차순):"+studentList);
    }
}

``
```실행결과
[Student(name=it, studentNo=28, grade=Junior), Student(name=java, studentNo=20, grade=Expert), Student(name=dev, studentNo=1002, grade=Junior)]
=======
학생이름(오름차순):[Student(name=dev, studentNo=1002, grade=Junior), Student(name=it, studentNo=28, grade=Junior), Student(name=java, studentNo=20, grade=Expert)]
profile
풀스택 호소인

0개의 댓글