Java 오브젝트끼리 비교하기

춤인형의 개발일지·2024년 12월 9일

java

목록 보기
11/14

24/12/09

오브젝트끼리 비교하기

String타입을 비교할 때 ==가 아닌, equals()를 사용했다.
==를 사용하면 비교가 안될까?

String타입은 주소가 다르다. 따라서 우리가 비교하고자 하는 것과 다른 것을 비교하기 때문에 다르게 나오는 것이다.

오브젝트의 비교가 중요한 이유는 오브젝트끼리의 비교가 한번에 이루어질 수 있기 때문이다. 세부적으로 생각하지 않아도 넘어갈 수 있기 때문이다. (오브젝트의 요소 하나하나를 신경쓸 수 없는 방대한 양의 데이터를 비교할 수 있기 때문에, 더 편리하게 사용하기 위해서!)

override

재정의
동등성을 도와주는 친구

//ball 클래스
 int position;
    int number;

    public Ball(int position, int number) {
        this.position = position;
        this.number = number;
    }
//test
 void ballEqualsTest() {
        // given
        // 같은 값의 Ball 오브젝트 두 개가 있는 상황에서
        Ball ball1 = new Ball(1, 2);
        Ball ball2 = new Ball(1,2);


        // when
        // 두 오브젝트를 equals()로 비교했을 때
        boolean ball비교 = ball1.equals(ball2);


        // then
        // 비교 결과는 true가 나와야 한다
        assertThat(ball비교).isTrue();
    }

현재 이 코드는 false가 나오기 때문에 에러가 난다.
왜냐? 오브젝트는 정의할 때마다 주소가 다르기 때문에 당연히 에러가 난다. 이걸 해결해주기 위해 오버라이드(재정의)를 해줘야한다.

   //alt+insert -> equals and hashcode()선택
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Ball ball = (Ball) o;
        return position == ball.position && number == ball.number;
    }

    @Override
    public int hashCode() {
        return Objects.hash(position, number);
    }

이걸 해주는 동시에 오브젝트끼리의 비교는 가능하게 되는 것이다. 위에서 본 그림과 같이 오브젝트의 주소가 아닌 int값의 비교가 가능해지게 되는 것이다. (position == ball.position && number == ball.number 이 코드가 그 역할을 해주는 것)


😐 느낀점

가장 중요한 것은 오버라이드를 사용하는 이유이다.
사용하는 이유는 실수방지 및 방대한 양의 데이터 신경안씀이다.
이걸 사용하는 이유에 대해서 꼭 생각하는 연습을 해야된다.
생각이 답,,, 책읽기~~~!!!

0개의 댓글