NAVER

질문 플릿 글라님 정리하여 질문드립니다.
비공개 조회수 94 작성일2019.04.25

  1.  @Override // 아래 궁금한 부분
  2.    public boolean equals(Object obj) {
  3.          if(this.num == ((INum)obj).num)
  4.              return true;
  5.          else
  6.              return false;


폴리글랏님 우선 늦은 시간까지 답변 해주셔서 대단히 감사합니다 ㅠㅠ
이어서 문의 좀 드리겠습니다.

위 처럼 오버라이딩했던 부분은 저자가 책 작성 당시 자바8 기준으로 작성되서 그랬던 것으로 확인되는데요.
자바8에서는 api에 아래와 같이 정리되어 있습니다.
주목할 부분은 if (e1==null ? e2==null : e1.equals(e2))요 부분인데요.
e1.equals(e2) 이게 object 클래스의 equals 메소드를 사용하기 때문에 위와 같이 오버라이딩 한 것으로 확인됩니다.
왜냐면 오브젝트 클래스의 해당 이퀄스 메소드는 참조값만 비교하므로 값 비교를 위해 오버라이딩 한 것으로 확인됩니다. 

추가로 이전에 답변 하셨던 거 확인해보니 static 메소드는 멤버 변수를 사용하지않고 static이나 지역 변수를 사용한다고 하셨는데요. 아래 로직을 보시면 아시다시피 arrays.equals 메소드는 static 메소드이나 object 클래스 멤버를 두개 받는 것으로 확인됩니다.

제가 알기로는 static 메소드는 인스턴스 생성없이 메소드 사용을 위하여 static 메소드로 정의하는 것으로 알고 있는데요. 답변에서 static 메소드는 static 변수 또는 지역 변수를 사용한다고 하셨는데, 죄송하게도 이 부분이 잘 이해가 안됩니다.


public static boolean equals(Object[] a,                             Object[] a2)
Returns true if the two specified arrays of Objects are equal to one another. The two arrays are considered equal if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal. Two objects e1 and e2 are considered equal if (e1==null ? e2==null : e1.equals(e2)). In other words, the two arrays are equal if they contain the same elements in the same order. Also, two array references are considered equal if both are null.

마지막으로 자바 11에서는 arrays.equals가 아래와 같이 변경된 것으로 확인됩니다.
여기서 if (!Objects.equals(a[i], a2[i])) 요 부분이 궁금한데요.

   public static boolean equals(Object[] a, Object[] a2) {

        if (a==a2)

            return true;

        if (a==null || a2==null)

            return false;


        int length = a.length;

        if (a2.length != length)

            return false;


        for (int i=0; i<length; i++) {

            if (!Objects.equals(a[i], a2[i]))

                return false;

        }


        return true;




저 부분이 아래와 같이 되어 있는데요.

a,b 비교가 참조값 비교인지 아니면 저장된 값 비교인지 궁금합니다.

저장된값 비교하도록 오버라이딩된 부분이 없는데, 어떻게 저장된 값 비교를 하는지 알려주시면 감사하겠습니다.


늦은 시간까지 답변해주시는 점 다시 한번 감사드립니다.

public static boolean equals(Object a, Object b) {

        return (a == b) || (a != null && a.equals(b));

    }

프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
폴리글랏
우주신 eXpert
남성 IT/인터넷업 #Java #JSP #Spring 자바, JSP 2위, 웹프로그래밍 1위, 자바스크립트 4위 분야에서 활동
본인 입력 포함 정보

Objects.equals 메소드는 아래와 같이 되어있군요

여기는 Object a와 b를 비교하지만 결국은 참조값이 아닌 저장된 값 비교입니다.


왜냐면 Arrays클래스의 equals 메소드 안에서 !Objects.equals(a[i], a2[i]) 처럼 저장된 값을


매개변수로 던지기 때문이죠


그리고; 오버라이딩 되었다고 설명하셨는데... 오버라이딩의 기준은 아시겠죠?


Arrays.equals나 Objects.equals는 오버라이딩이 아닌 본인만의 메소드입니다.


equals 메소드를 오버라이딩 하려면 static이 아니어야 하고 매개변수를 1개만 가져야합니다.



이것도 걍 Object 클래스의 equals메소드를 사용하는 것뿐이죠

2019.04.25.

  • 채택

    질문자가 채택한 답변입니다.

이 답변의 추가 Q&A
질문자와 답변자가 추가로 묻고 답하며 지식을 공유할 수 있습니다.
도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.