• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

isEqulaTo / isSameAs

23.11.26 06:39 작성 조회수 221

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

OMG님의 프로필

OMG

2023.11.26

안녕하세요. 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);
    }
    */
}

 

 

감사합니다.