작성
·
760
답변 6
3
말(글) 로만 설명 드린거 같아서 간단한 예제 테스트 코드도 작성해 보았습니다 ^^
위의 테스트 코드는 같은 '값'과 같은 메모리 주소를 가리키기 때문에 isEqualTo와 isSameAs가 둘다 성공 하는 것을 확인 하실 수 있습니다.
,
아래의 테스트 코드는 같은 '값' 이지만 new연산자를 사용하여 새로운 메모리 주소를 할당 하였기 때문에 같은 값일지라도 동일한 메모리 주소를 참조하고 있지 않기 때문에 테스트가 실패하는 것을 볼 수 있습니다.
추가적으로 isNot~() 으로 테스트 결과의 true / false 반대 상황을 확인 해 보실 수도 있으세요
궁금한 점 있으시면 추가적인 댓글이나 질문글 남겨주세요 ^^
2
1
1
안녕하세요.
=====
Object 클래스의 equals() 메서드도 객체끼리 비교하면 같은 객체인지를 기본적으로(오버라이딩 하지 않았을 때) 객체의 주소로 비교해주니까
=> 맞습니다. Object 클래스의 equals는 아래의 Java doc에도 나와있듯 참조 값을 비교하고 있습니다.
다른 포스팅에 있는 내용도 가져와 볼게요.
- 기본 동작: '==' 연산 결과 반환
- override 목적: 물리적으로 다른 메모리에 위치하는 객체여도 논리적으로 동일함을 구현하기 위해
여기서 중요한 내용은 "물리적으로 다른 메모리"와 "논리적으로 동일함" 인데요.
물리적으로 다른 메모리 = (== 비교를 통한 주소 값이 다르더라도)
논리적으로 동일함 = (값 비교(equals)를 통해 같은 값이기만 한다면 같은 객체임을 보장하기 위함)
으로 이해할 수 있겠죠?
자, 그럼 다음 내용을 보면
isEqualTo가 equals처럼 동작한다면
=>
8분 55초부터 영한님이 하신 말씀입니다.
"자바에 보면 equals 라는 메서드 오버라이드 할 수 있거든요. 바로 그걸 비교하는겁니다. "
이 말인 즉슨 equals 메서드를 오버라이드 통한 값 비교를 하는 동작을 한다는 것이지 Object의 기본동작인 주소 값 비교를 한다는 뜻이 아닙니다. 이 부분을 오해 하신거 같아요.
즉, 정리하자면 isSameAs로 참조 값 비교를, isEqualTo로 값 자체 비교를 할 때 사용하는 것이라고 생각하시면 되겠습니다.
isSameAs말고 isEqualTo로 비교해도 되지 않나요? (영상 8:36)
자 이제 다시 영한님 강의 화면을 보시죠. @DisplayName() 안의 내용과 콘솔 출력 결과를 보시면,
이해가 되셨을거라 생각합니다.
설명이 미흡하거나 잘못되었다고 생각하시면 댓글 남겨주세요!
0
== 연산, equals() 메서드 차이를 공부해보시면 좋을 것 같습니다.
강의 8:55분쯤을 보시면 강사님께서 same은 ==, equal은 equals를 생각하시면 된다고 설명해주셨습니다.
String 클래스의 equals() 메서드를 확인해보시면 1. == 연산으로 두 객체의 참조값이 같은지를 확인, 2. 두 문자열의 구성이 같은지를 확인하도록 Object의 equals() 메서드를 오버라이딩한 것을 확인할 수 있습니다.
즉, isEqualTo는 같은 객체인지도 비교하며, 같은 참조값이 아니더라도 String 클래스의 equals() 메서드에 따라 두 문자열의 구성이 같다면 true을 반환합니다.
반면 isSameAs는 두 객체의 참조값이 같은지만 비교하기 때문에 위 예제에서는 false를 반환합니다.
1, 2번 테스트의 차이는 String 객체를 생성하는 방법인 new 연산과 리터럴 방식을 공부해보시면 좋을듯합니다.
0
세번정도 읽어봤는데 지식이 부족해서 이해가 안가는데 질문 드려도될까요..? 댓글로 달아주신 예제코드처럼 test해보니 isEqualTo는 성공하고 isSameAs는 실패하네요. 즉, IsEqualTo는 같은 객체인지 비교하는게 아니라 안에 값만 비교하는 것이고, isSameAs는 같은 객체인지 비교하는 것이라고 추정했는데, 이해한게 맞을까요?
네 맞습니다. isEqualTo는 a = 10, b = 10 과 같이 원시 타입(프리미티브)의 값 자체를 비교를 하는 반면
isSameAs는 메모리에 올라가진 주소를 비교합니다.
가령,
Member member1 = new Member("홍길동");
Member member2 = new Member("홍길동");
이 둘은 이름이 홍길동으로 같은 name을 가지겠지만, 서로 다른 메모리주소 공간에 올라가 있는 인스턴스 이므로 member1 != member2 이기 때문에 isSameAs 비교시 실패하게 되는 것입니다.
제 설명이 잘 이해 되지 않으시면
"자바 동일성 동등성"으로 검색하시면 많은 정보들을 찾아보실 수 있으실거에요.