24/12/09
String타입을 비교할 때
==가 아닌,equals()를 사용했다.
왜==를 사용하면 비교가 안될까?
String타입은 주소가 다르다. 따라서 우리가 비교하고자 하는 것과 다른 것을 비교하기 때문에 다르게 나오는 것이다.


오브젝트의 비교가 중요한 이유는 오브젝트끼리의 비교가 한번에 이루어질 수 있기 때문이다. 세부적으로 생각하지 않아도 넘어갈 수 있기 때문이다. (오브젝트의 요소 하나하나를 신경쓸 수 없는 방대한 양의 데이터를 비교할 수 있기 때문에, 더 편리하게 사용하기 위해서!)
재정의
동등성을 도와주는 친구
//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 이 코드가 그 역할을 해주는 것)
😐 느낀점
가장 중요한 것은 오버라이드를 사용하는 이유이다.
사용하는 이유는 실수방지 및 방대한 양의 데이터 신경안씀이다.
이걸 사용하는 이유에 대해서 꼭 생각하는 연습을 해야된다.
생각이 답,,, 책읽기~~~!!!