자바 Comparable Interface
자바로 개발을 하다보면 Domain 클래스 구현을 위해 primitive 타입 자료형을 감싸는 경우가 있다.
primitive 타입이 다음과 같이 Domain클래스로 Wrapping될 경우 외부에서 따로 처리해주어야 하던 값 검증 로직을 클래스 내부에 작성하여 생성자를 통해 객체 생성 시에 값 검증까지 처리할 수 있다는 장점이 생긴다.
public class User {
private int age;
private String name;
public User(int age, String name){
this.age = age;
this.name = name;
}
}
User user1 = new User(10,'sj');
User user2 = new User(27,'sh');
하지만 만약 User라는 Domain 클래스로 이를 구현하게 된다면 위처럼 구현하게 되는데 위와 같이 구현하게 되면 User 자료형으로 만들어진 배열이나 컬렉션을 정렬해야하는 상황에서 어려움을 겪게 된다.
나이순으로 User배열을 내림차순 정렬 해야한다면 어떻게 해야 객체끼리 비교할 수 있을까?
이를 해결하기 위해 존재하는 것이 바로 Comparable 인터페이스이다.
Comparable 인터페이스는 객체의 비교 규칙을 재정의하기 위해 사용하는 인터페이스이다
Comparable 인터페이스를 통하여 비교 로직을 구현하려면 우선 인터페이스를 상속받아야한다.
상속을 받으면 위처럼 레드 라인이 나타나는데 이는 compareTo 메서드를 @Override 해주지 않았기 때문이다.
이처럼 Comparable 인터페이스를 implements 하면 compareTo 메서드를 Override 해주어야한다.
구현하게 되면 파라미터로 User를 받게 되는데 User 파라미터는 비교할 객체이다.
비교 로직은 this.age - u.age 로 간단하다.
현재 User객체의 age가 더 높으면 양수를 return
비교하는 User 객체의 age가 더 높으면 음수를 return
두 User 객체의 age가 동일하면 0을 return
return 받은 값을 토대로 '크다' , '작다' , '같다'를 비교해서 오름차순 정렬을 하는 것이다.
11, 82, 21 의 age가 존재하면
11 21 82 순서대로 정렬되는 것이다.
만약 내림차순으로 정렬하고자 한다면?
return u.age - this.age;
이렇게 반대로 계산해주면 내림차순으로 정렬된다.
이제 Comparable 인터페이스를 적용하여 구현한 코드를 보고 마치도록 하겠다.
void userCompare() {
User u1 = new User(11,"sj");
User u2 = new User(82,"sh");
User u3 = new User(21,"sz");
ArrayList<User> userList = new ArrayList<>(List.of(u1,u2,u3));
userList.forEach(u -> System.out.print(u.getAge() + " "));
System.out.println("\nsort()");
Collections.sort(userList);
userList.forEach(u -> System.out.print(u.getAge() + " "));
}
이처럼 나이순으로 User ArrayList가 정렬된 것을 확인할 수 있다.
'Language > Java' 카테고리의 다른 글
[Java] LinkedHashMap을 통한 기초 캐싱 (0) | 2024.02.25 |
---|---|
[Java] @NotBlank, @NotNull, @NotEmpty 차이 (1) | 2023.06.12 |
[JAVA] ObjectMapper를 통한 손쉬운 객체 형식 변환 (2) | 2022.09.17 |
[Java] 여러 데이터를 저장하는 법 - Array, List, Map (3) | 2022.08.15 |
[객체지향] SOLID 원칙이란? (4) | 2022.03.28 |