자바) 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 메서드가 구현되어 있는 방법을 설명한거라 두 책 다 옳다라고 할 수 있습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력