일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 이것이 자바다 확인문제
- 트리 지름 구하기
- 채팅GPT
- 이노캠
- 자바
- 이노베이션캠프
- Java
- 객체지향
- 백준
- 인프런
- dfs
- 이것이 자바다
- 3장 확인문제
- Comparable과 Comparable
- 이노베이션 캠프
- ArrayList 개념
- 이노베이션캠프 동북
- Til
- 자바의 정석 6장
- 자바 언어 기초
- 자료구조
- 이것이 자바다 13장
- 챗GPT 명령어 작성팁
- 웹개발 기본지식
- ChatGPT
- BFS
- JAVA 기초
- 조건문과 반복문
- 이것이 자바다 연습문제
- 스프링 입문강의
- Today
- Total
기록공간
[Java] Comparable, Comparator 인터페이스의 이해와 사용 방법 본문
Comparator와 Comparable 인터페이스가 자바에서 왜 중요한지부터 알아보겠습니다.
자바와 같이, 객체지향언어를 사용하다보면 객체를 정렬해야하는 경우가 생깁니다.
아래와 같이 예시를 먼저 들어보겠습니다.
ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));
위 그림은, list에 Movie 객체를 선언해서 담은 모습입니다.
Movie 객체는, Name과 Rating, year를 인스턴스로 갖고있습니다.
이러한 객체를 Year를 기준으로 오름차순 정렬한다고 해봅시다.
이를 위해서는 Comparable과 Comparator 인터페이스(Interface)에 대해 알아야 할 필요가 있습니다.
Comparable
Comparable 인터페이스(Interface)를 사용하기위해서는, CompareTo 메소드를 재정의 해야합니다.
- CompareTo Method에 대해
위와 같이, CompareTo 메소드는 int형을 반환하고, 매개변수로 객체 자료형을 매개변수로 입력 받는 것을 보실 수 있습니다.
아래 코드를 보시면, Movie객체에는 "rating"과 "name", "year" 인스턴스가 있습니다.
"Movie"객체에서, "year"을 기준으로 오름차순 정렬을 해보겠습니다.
이를 위해, 다음과 같이 Comparable<> Interface를 구현하였고, <>에 들어갈 타입은 객체타입의 자료형을 나타냅니다.
이 interface를 사용하기 위해서는, 정렬 기준을 만들어줄, comparaTo 메소드를 재정의 하였습니다.
class Movie implements Comparable<Movie>
{
private double rating;
private String name;
private int year;
// year를 기준으로 정렬하기 위해 CompareTo 메소드 재정의
public int compareTo(Movie m)
{
return this.year - m.year;
}
// 생성자
public Movie(String nm, double rt, int yr)
{
this.name = nm;
this.rating = rt;
this.year = yr;
}
// Getter 메소드
public double getRating() { return rating; }
public String getName() { return name; }
public int getYear() { return year; }
}
매개변수로, Movie 객체를 입력받고,
return 부분에서 "this" 현재 객체와 매개변수로 전달된 다른 객체의 year의 차이를 반환하는 것을 보실 수 있습니다.
여기서 CompareTo 메소드의 각 케이스에 대해 설명하자면,
양수 일경우, 호출하는 객체의 year이 더 크다는 것을 의미합니다.
0 일경우, 두 객체의 year이 같다는 것을 의미합니다.
음수 일 경우, 호출하는 객체가 매개변수로 전달받은 객체의 year보다 작다는 것을 의미합니다.
다음으로, Main함수에서 Movie 객체를 담을 List를 선언한 후,
Movie 객체를 생성하여, List에 담아줍니다.
ArrayList<Movie> list = new ArrayList<Movie>();
list.add(new Movie("Force Awakens", 8.3, 2015));
list.add(new Movie("Star Wars", 8.7, 1977));
list.add(new Movie("Empire Strikes Back", 8.8, 1980));
list.add(new Movie("Return of the Jedi", 8.4, 1983));
Collections.sort 메소드를 사용하여, Movie 객체를 year순으로 오름차순 정렬합니다.
그 후, 다음과 같이 코드를 입력하면,
Collections.sort(list);
System.out.println("Movies after sorting : ");
for (Movie movie: list)
{
System.out.println(movie.getName() + " " +
movie.getRating() + " " +
movie.getYear());
}
다음과 같이, year 순으로 오름차순 정렬 된 것을 보실 수 있습니다.
Comparator
Comparator 인터페이스를 사용하려면, Compare 인터페이스와는 다르게,
compare 메소드를 재정의 해야합니다.
compare 메소드는 CompareTo 메소드와는 다르게, 매개변수로 서로 다른 객체의 인스턴스를 받습니다.
아래 예시를 먼저 보겠습니다.
salary와 name을 인스턴스로 가지고 있는 Employee 객체를 salary를 기준으로 내림차순으로 정렬한다고 가정합시다.
List<Employee> employees = new ArrayList<>();
employees.add(new Employee("Alice", 50000));
employees.add(new Employee("Bob", 75000));
employees.add(new Employee("Charlie", 60000));
먼저 employee 객체를 담을 List를 선언하고, List에 객체를 담습니다.
위 객체들의 salary를 기준으로 내림차순 정렬을 하기위해,
Comparator<객체자료형> 함수명 = new Comparator<객체자료형>() 로 인터페이스를 선언하고,
compare Method를 다음과 같이 재정의해줍니다.
Comparator<Employee> salaryComparator = new Comparator<Employee>() {
@Override
public int compare(Employee e1, Employee e2) {
return e2.getSalary()-e1.getSalary()
}
};
위와 같이 compare 메소드는 Employee 객체 2개를 입력으로 받고, 두번째 매개변수 객체(e2)에서 첫번째 매개변수(e1) 객체의 Salary 차이를 정수형으로 반환합니다.
다음과 같이 EmployeeSalaryComparator 클래스를 Employee 자료형으로 하는 Comparator 인터페이스를 구현하겠습니다. 이를 위해 두 객체를 매개변수로 받는 compare 메소드를 재정의 해야합니다.
차이는 양수 혹은 음수, 0이 나오게 될 것입니다.
양수일 경우 : 첫번째 객체 (e1) Salary가 두번째 객체(e2)의 Salary보다 작다는 것을 의미합니다.
0 : 첫번째 객체 (e1) Salary가 두번째 객체(e2)의 Salary와 같다는 것을 의미합니다.
음수 : 첫번째 객체 (e1) Salary가 두번째 객체(e2)의 Salary보다 크다는 것을 의미합니다.
만약 결과가 음수라는 것은, 정렬된 List에서 첫번째 객체(e2에 비해 Salary가 더 큰 객체)가 두번째 객체보다 앞으로 나오는 것을 의미합니다.
위처럼 Comparator 인터페이스를 정의하고 Compare 메소드를 Override한 후,
Collections.sort(employees, salaryComparator);
System.out.println(employees);
정렬을 하여, 출력을하면 아래와 같이 salary를 기준으로 내림차순 형태로 출력되는 것을 보실 수 있습니다.
'JAVA & Spring' 카테고리의 다른 글
[JAVA] 이것이 자바다 13장 연습문제 (제네릭) (0) | 2023.04.03 |
---|---|
[JAVA] 이것이 자바다 11장 연습문제 (예외 처리) (0) | 2023.03.28 |
[JAVA] 이것이 자바다 9장 확인 문제 (중첩 선언과 익명 객체 ) (0) | 2023.01.08 |
[JAVA] 이것이 자바다 8장 확인 문제 (인터페이스) (0) | 2023.01.05 |
[JAVA] 이것이 자바다 확인 문제 7장 (상속) (0) | 2023.01.03 |