함수형 인터페이스 공부하다가, Comparator 인터페이스 @FunctionalInterface 애노테이션이 붙은 것을 확인했다.
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
...
}
해당 애노테이션은 Comparator가 함수형 인터페이스라고 명시하는 것이다.
그러나 함수형 인터페이스는 추상 메서드가 한 개여야 한다.
근데 Comparator는 위와 같이 추상 메서드가 두개다.
-> 왜 Comparator를 함수형 인터페이스로 명시한걸까하는 의문이 들었다.
찾아보니, 모든 클래스는 Object 클래스를 상속받데,
만약 아무 것도 상속받지 않은 클래스가 있으면 (ex. Comparator)
컴파일러가 알아서 Object를 상속해준다.
그리고, equals()는 Object 클래스에 정의되어 있다.
public class Object {
...
public boolean equals(Object obj) {
return (this == obj);
}
...
}
즉, Comparator 인터페이스의 구현체가 equals()를 오버라이딩하지 않으면,
자동으로 Object의 equals()를 사용할 수 있으니,
실질적인 추상 메서드는 compare() 하나라고 볼 수 있겠다.
-> 실제로 compare()만 오버라이딩해도 함수형 인터페이스의 익명 객체를 만들 수 있다.
list.sort(new Comparator<User>() {
@Override
public int compare(CryptoCurrency cc1, CryptoCurrency cc2) {
return cc1.name().compareTo(cc2.name());
}
});
그리고 이러한 함수형 인터페이스는 당연히 람다 표현식으로도 표현 가능하다.
list.sort((cc1, cc2) -> cc1.name().compareTo(cc2.name()));
+) 어차피 Object 클래스에 equals()가 정의되어 있는데, 굳이 equals()를 Comparator 인터페이스에 선언해 놓을 필요가 있나?
정확하진 않지만, 추측 상으로는 두 객체를 '비교'한다는 것은 객체의 순서(compare)도 중요하지만, 객체가 동일(equals)한지도 확인해야 할 수도 있기 때문에, compare과 equals 모두를 활용하라고 Comparator 인터페이스라는 명세서에 적어 놓은 것이 아닐까 싶다.
'java > java' 카테고리의 다른 글
[Java] Suppressed Exception (0) | 2024.05.06 |
---|---|
[Java] public class (0) | 2024.02.23 |
Mockito (0) | 2023.07.12 |
[Java] 등가속도 운동 - t초 후의 위치 계산 (0) | 2023.01.11 |
[Java] 메서드 애노테이션 정보 가져오기 (3) | 2022.03.12 |