• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

Java Comparator 인터페이스 - 람다 표현

23.06.23 18:38 작성 조회수 431

0

안녕하세요 강의 감사히 잘 듣고 있습니다.

 

comparator 인터페이스(람다 인터페이스) 내부 코드 확인 중에,

equals()라는 메서드도 있는데, 이건 Object 클래스 메서드를 오버라이딩 한 것이라고 IntelliJ에서 알려줬습니다.

compare() 메서드랑 구조(리턴타입 메서드명(파라미터))가 똑같고, @override 표시가 없는데, equals()가 오버라이딩 되었는지 어떻게 확인할 수 있나요?

답변 2

·

답변을 작성해보세요.

0

Java의 Comparator 인터페이스는 실제로 equals 메소드를 정의하지 않지만, 모든 자바 객체가 상속받는 Object 클래스의 메소드인 equals를 가지고 있습니다. 이 메소드는 두 객체가 같은지 비교하는 데 사용됩니다.

그러나 Comparator에서 equals 메소드의 명시적인 정의를 찾을 수 있는 이유는 Comparator의 일반 규약에 의해 equals 메소드가 필요할 수도 있기 때문입니다. 이는 Comparator 인스턴스를 PriorityQueue와 같은 특정 자료구조에 전달하거나 Collections.sort()와 같은 메소드에 전달할 때 중요합니다. 이런 경우 해당 자료구조 또는 메소드는 내부적으로 Comparatorequals 메소드를 사용할 수 있습니다.

Comparator 인터페이스의 equals 메소드는 다음과 같은 규약을 가집니다:

  • Comparator가 비교할 수 있는 모든 객체 집합이 동일한 순서로 주어진 경우, 두 Comparatorequals로 비교하면 true가 반환되어야 합니다.

다시 말해, Comparator 인터페이스의 equals 메소드는 주로 Comparator의 동등성을 검사하는 데 사용되며, 이것은 Comparator가 비교하는 방식, 즉 비교 로직이 동일한지를 판단하는 것을 의미합니다. 그러나 이러한 사용 사례는 매우 드물고, 대부분의 경우 개발자는 Comparatorequals 메소드를 재정의할 필요가 없습니다.

아래는 Comparator에서 equals 메소드를 재정의하는 예시입니다:

Comparator<String> caseInsensitiveComparator = new Comparator<>() {

@Override

public int compare(String o1, String o2) {

return o1.compareToIgnoreCase(o2);

}

@Override

public boolean equals(Object obj) {

return obj != null && obj instanceof Comparator;

}

};



equals 메소드는 objComparator의 인스턴스인지 확인합니다. 이것은 실제로 유용한 구현이 아닙니다(왜냐하면 모든 Comparator를 동일하게 취급하기 때문입니다), 하지만 이것은 어떻게 equals 메소드가 Comparator에서 재정의될 수 있는지에 대한 예를 보여줍니다. 일반적으로, equals 메소드를 재정의하는 경우 비교 로직이 같은지 확인하는 로직을 구현하게 됩니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.06.25

안녕하세요, 인프런 AI 인턴입니다.

Comparator 인터페이스에는 equals() 메서드가 정의되어 있지 않습니다. Object 클래스에서 상속받은 메서드를 오버라이딩한 것이 아니라 확인하시면 감사하겠습니다.

그리고 equals() 메서드를 오버라이딩한다면, @Override 어노테이션이 표시됩니다. 따라서 해당 메서드 위에 @Override 어노테이션을 찾아보시면 오버라이딩 여부를 확인할 수 있습니다.

감사합니다.

답변 감사합니다.

그럼 제가 첨부한 이미지에 있는

boolean equals(Object obj); -> 이건 무엇을 의미하는 건가요?