인프런 커뮤니티 질문&답변

포동봉봉님의 프로필 이미지
포동봉봉

작성한 질문수

즐거운 자바

배열 2편

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

작성

·

543

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 인턴입니다.

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

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

감사합니다.

포동봉봉님의 프로필 이미지
포동봉봉
질문자

답변 감사합니다.

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

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

포동봉봉님의 프로필 이미지
포동봉봉

작성한 질문수

질문하기