9. 값 타입 (값 타입의 비교)

HotFried·2023년 10월 2일
0

값 타입의 비교

값 타입은 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야한다.

  • int a == int b는 값을 비교하기 때문에 true
  • Address a == Address b는 참조 값을 비교하기 때문에 false

동일성(identity) 비교

인스턴스의 참조 값을 비교 == 사용


동등성(equivalence) 비교

인스턴스의 값을 비교, equals() 사용

따라서 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야한다.
값 타입의 equals() 메소드를 적절하게 재정의 해야한다.

Address address1 = new Address("city", "street", "10000");
Address address2 = new Address("city", "street", "10000");

System.out.println("address1==address2: " (address1==address2));
System.out.println("address1 equals address2: " (address1.equals(address2)));
address1==address2: false
address1 equals address2: false

equals()를 이용해 동등성 비교를 해도 false가 출력된다.
-> equals() 기본 구현이 ==비교로 되어있다.

public boolean equals(Object obj){
	return (this == obj);
    }

따라서 equals()를 오버라이딩해서 사용해야한다.
또한 equals()를 오버라이딩 할 때, hashcode()도 오버라이딩 해야 자바 컬렉션에서 효율적으로 사용할 수 있다.

class Address {
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Address address = (Address) o;
        return Objects.equals(city, address.city) && Objects
                .equals(street, address.street) && Objects.equals(zipcode, address.zipcode);
    }

    @Override
    public int hashCode() {
        return Objects.hash(city, street, zipcode);
    }
}

오버라이딩 후 Main Code를 실행하면

address1==address2: false
address1 equals address2: true

equals() 동등성 비교시 true가 출력된다.


참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글