자바) Object 클래스의 equlas() 질문좀 드려요

조회수 1115회

책읽다가 헷갈리는게 있어서요..책두권인데..

한권은

책1

Obejct의 equlas () 는 비교연산자인 == 와 동일한 결과를 리턴한다. 동일하면 true, 다르면 false. 자바에서는 두 객체를 동등비교할때 equals() 를 사용한다. 두 객체를 비교해서 논리적으로 동등하면 true, 그렇지 않으면 false를 리턴. 논리적으로 동등하다는것은 같은 객체이건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일함을 뜻한다.

Object obj1 = new Object();

Object obj2 = new Object();



boolean result = obj1.equlas(obj2); // 결과 동일

boolean result = (obj1 == obj2)  // 결과 동일

책2

이 메소드는 == 연산자와 마찬가지로 참조변수의 참조값을 비교하도록 정의되어있다.

라고 되어있는데요...

책2의 정의를가지고 책1을보면 책1은 참조값 비교하는게 아니지않나요?

obj1 이랑 obj2랑 다른 객체잖아요..참조값(주소값)이 다른데.. 책2의 정의가지고 책1을 비교하면

다른 객체라고 되어야하는것아닌가요..?

책이 잘못된건지 ㅠ

3 답변

  • 기본적으로 ==은 두 객체가 같은 주소를 가리키고 있는지를 확인하고, equals()는 두 객체가 같은 값을 가지고 있는지를 확인합니다.

    그런데 책1의 설명을 보면 Object라는 객체를 기준으로 equals()==이 동일한 역할을 한다는 것으로 보이고, 그렇게 생각하고 보면 책2에서도 비슷한 설명을 하고 있는 것 같습니다.

    즉, Object 객체에서는 equals()라는 method가 ==와 동일한 작업을 하도록 정의되어 있고, 따라서 각각이 동일한 결과를 반환한다는 내용으로 보입니다.

    Object 객체가 아닌 다른 객체들에 이를 적용하거나 특정 객체의 equals() method를 오버라이딩한다면 결과가 다를 수 있습니다.

  • Obejct의 equlas () 는 비교연산자인 == 와 동일한 결과를 리턴한다.

    단순히 equlas 메서드가 == 와 같이 boolean 값을 리턴한다는 설명같습니다.

    자바에서는 두 객체를 동등비교할때 equals() 를 사용한다. 두 객체를 비교해서 논리적으로 동등하면 true, 그렇지 않으면 false를 리턴.

    아직 참조변수나 참조값에 대한 설명이 나올 차례가 아닌가봅니다.

    그리고 책1 예제가 책에 나와있는건가요 아니면 질문자님이 추가하신건가요? 결과가 둘다 false 로 나올텐데요.

  • Object class "equals" 함수는 재정의 하지 않으면 리턴 값은 "=="와 같습니다. 만약 어느 한 class의 "equals"가 "=="와 같지 않으면 그것은 재정의(Override)를 했기 때문입니다. Java에서는 "equals" 메소드를 제작할때 두 객체의 '값'을 비교하라는 의의를 두고 만들었지만 Object같은 경우 모든 class 부모가 되는 class 이기 때문에 데이터를 담고 있지 않습니다. 따라서 비교할 값이 없으므로 "equals"는 "=="와 같은 역활을 합니다.

    더 자세하게 설명을 하자면 "equals"를 오버라이딩할때 "일반 규약"이 있습니다.

    그 중 하나를 설명 드리자면

    어느한 객체 x가 있을때 x.equals(x)의 리턴 값은 "true"어야 한다.

    라는게 있습니다. 더 자세한거는 "equals 일반 규약"을 검색해보세요. 따라서 "Object" 클래스 같은 경유 일반 규약을 잘 지켰다. 라고 할 수 있겠네요.

    물론 Java에서 일반규약을 강제하지도 않고 강제하는 법도 없습니다. 따라서

        @Override
        public boolean equals(Object obj) {
            return false;
        }
    

    다음과 같이 작성하셔도 상관은 없지만 이렇게 되면 파라미터 "obj"와 상관없이 모든 상황에 대해서 false를 리턴하게 될 것 입니다. 이는 이후에 다른 사람이 코딩을 할때 예상하지 못한 상황이 이러날 확률이 있지요. 사용하지 "못"하는 방법은 아니고 꼭 사용해야할 상황도 있을 수 있지만 일반적으로 바람직한 방법은 아니인 겁니다.

    그래서 정확한 질문에 대답은 드리자면 저 위에 두개의 result에 대해서 똑같이 false라는 결과가 나왔을 겁니다.

    책1의 설명은

    "논리적으로 동등하다는것은 같은 객체이건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일함을 뜻한다."

    는 "equals" 설계의 의의를 두고 설명을 한 것 같네요.

    그리고 책2의 설명

    "이 메소드는 == 연산자와 마찬가지로 참조변수의 참조값을 비교하도록 정의되어있다."

    는 실질적으로 Object의 equals 메서드가 구현되어 있는 방법을 설명한거라 두 책 다 옳다라고 할 수 있습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)