작성
·
304
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
isEqulaTo는 값을 비교 / isSameAs는 참조(주소)값을 비교하는 걸로 알고 있습니다. 허나, 아래 질문게시글의 답변과 같이 객체의 경우, isEqulaTo는 isSameAs와 같이 참조를 비교하는 것을 알 수가 있습니다.
그렇다면 아래 예시와 같이 String도 객체인데 왜 이 경우는 참조가 아닌 값을 비교하나요? (이 경우 테스트가 통과됩니다!)
String a = new String("aa");
String b = new String("aa");
assertThat(a).isEqualTo(b);
답변 1
1
안녕하세요. 980513k님, 공식 서포터즈 OMG입니다.
isEqualTo()는 내부적으로 객체의 equals()
를 호출하는데요.
String
클래스의 equals()
는 문자열의 값을 비교합니다, 즉 두 String
객체가 같은 문자열을 담고 있는지 확인합니다.
기본적으로 Object
클래스의 equals()
메서드는 두 객체의 참조(주소)를 비교하지만 String
클래스는 Object
클래스의 equals()
메서드를 재정의하여 문자열의 내용을 비교하도록 구현되어있습니다.
이 구현 덕분에 같은 문자열을 가지고 있지만 서로 다른 메모리 주소에 있는 두 String
객체도 equals()
메서드로 비교했을 때 true
를 반환합니다.
따라서 isEqualTo()를 호출하였을 때 객체 비교라 할지라도 만약 equals()를 재정의 하지 않았다면 참조를 비교하겠지만 equals()를 재정의하여 값을 비교한다면 그 내용에 따라 아래의 테스트 코드도 참이 될 수 있습니다.
@Test
void test() {
Dog fido = new Dog("Fido", 5.25f);
Dog fidoClone = new Dog("Fido", 5.25f);
Assertions.assertThat(fido).isEqualTo(fidoClone);
}
올리신 Dog클래스 예제로 테스트해보시면 좋을 것 같아 코드 첨부드리니 확인해보시면 좋을 것 같아요.
주석 부분을 그대로 둔 채 테스트를 실행해보신 후,
아래의 주석을 풀고 실행했을 때는 테스트가 성공되는 것을 보실 수 있을거에요
public class Dog {
private String name;
private Float weight;
public Dog() {}
public Dog(String name, Float weight) {
this.name = name;
this.weight = weight;
}
// standard getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getWeight() {
return weight;
}
public void setWeight(Float weight) {
this.weight = weight;
}
/*
@Override
public boolean equals(Object o) {
System.out.println("dog의 Equals() 출력 확인");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dog dog = (Dog) o;
return Objects.equals(name, dog.name) && Objects.equals(weight, dog.weight);
}
@Override
public int hashCode() {
return Objects.hash(name, weight);
}
*/
}
감사합니다.