inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

싱글톤 패턴

equals 메서드도

952

bs k

작성한 질문수 22

0

Object 클래스의 equals() 메서드도 객체끼리 비교하면 같은 객체인지를 기본적으로(오버라이딩 하지 않았을 때) 객체의 주소로 비교해주니까 isEqualTo가 equals처럼 동작한다면 isSameAs말고 isEqualTo로 비교해도 되지 않나요? (영상 8:36)

spring oop

답변 6

3

OMG

말(글) 로만 설명 드린거 같아서 간단한 예제 테스트 코드도 작성해 보았습니다 ^^

위의 테스트 코드는 같은 '값'과 같은 메모리 주소를 가리키기 때문에 isEqualTo와 isSameAs가 둘다 성공 하는 것을 확인 하실 수 있습니다.

,

아래의 테스트 코드는 같은 '값' 이지만 new연산자를 사용하여 새로운 메모리 주소를 할당 하였기 때문에 같은 값일지라도 동일한 메모리 주소를 참조하고 있지 않기 때문에 테스트가 실패하는 것을 볼 수 있습니다.

추가적으로 isNot~() 으로 테스트 결과의 true / false 반대 상황을 확인 해 보실 수도 있으세요

궁금한 점 있으시면 추가적인 댓글이나 질문글 남겨주세요 ^^

2

bs k

감사합니다!

1

bs k

아! 영한님 말씀을 제가 잘못 이해했었네요 상세한 답변 감사합니다.

1

OMG

안녕하세요.

=====

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는 같은 객체인지 비교하는 것이라고 추정했는데, 이해한게 맞을까요?

0

OMG

네 맞습니다. isEqualTo는 a = 10, b = 10 과 같이 원시 타입(프리미티브)의 값 자체를 비교를 하는 반면

isSameAs는 메모리에 올라가진 주소를 비교합니다. 

가령,

Member member1 = new Member("홍길동");

Member member2 = new Member("홍길동");

이 둘은 이름이 홍길동으로 같은 name을 가지겠지만, 서로 다른 메모리주소 공간에 올라가 있는 인스턴스 이므로 member1 != member2 이기 때문에 isSameAs 비교시 실패하게 되는 것입니다.

제 설명이 잘 이해 되지 않으시면 

"자바 동일성 동등성"으로 검색하시면 많은 정보들을 찾아보실 수 있으실거에요.

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

43

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

72

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

87

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

79

1

테스트 속도가 나중에 영향이 있을까요?

0

75

1

gradle 설정 안떠서 질문 남깁니다!

0

116

2

build.gradle로 프로젝트를 여는 이유

0

81

1

provider 사용하는 이유

0

82

1

다음 강의 뭘 들어야 할까요

0

123

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

62

1

beanB

0

79

2

퀴즈다시풀기

0

63

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

90

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

63

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

102

2

도메인의 정의?

0

57

1

ApplicationContext 질문입니다.

0

60

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

86

2

ai api 선정하기 관련 질문

0

115

2

생성자 자동주입 관련해서

0

60

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

91

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

62

1

12:25

0

74

2

appConfig.xml 오류

0

123

1