==
동일성은 두 객체가 정확히 같은 것인지를 나타내는 개념이다.
A와 B가 동일하다는 것은 A와 B가 정확히 같은 객체라는 뜻이다.
객체의 내용, 상태, 속성 등이 모두 동일한 경우에만 성립한다.
이는 메모리 상에서 같은 위치에 존재하는지 확인하는게 필요하다.
Object a = new Object();
Object b = a;
if (a == b) {
System.out.println("동일한 객체.");
}
.equals()
동등성은 두 객체가 같은 것으로 간주될 수 있는지를 나타내는 개념이다.
A와 B가 동등하다는 것은 A와 B가 같은 값을 가진다는 뜻이다.
객체의 내용, 상태, 속성 등이 완전히 일치하지 않더라도,
중요한 측면에서는 같다고 간주될 수 있는 경우에 성립한다. ( 예를 들어 이름 , 값 )
객체지향에서의 동일성은 두개의 객체가 메모리에서 같은 위치에 존재하는지 여부를 나타내는 것이고
동등성 은 두 객체가 다른 메모리 지점에 있어도
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// equals 메서드 오버라이딩
@Override
public boolean equals(Object obj) {
// 1. obj가 null이면 false 반환
// 2. obj의 클래스가 Person 클래스와 다르면 false 반환
if (obj == null || getClass() != obj.getClass()) {
return false;
}
// obj를 Person 타입으로 캐스팅
Person person = (Person) obj;
// 3. 두 객체의 내용이 모두 같은 경우에 true 반환
return age == person.age && Objects.equals(name, person.name);
}
}
// Person 객체 생성
Person p1 = new Person("Alice", 30);
Person p2 = new Person("Alice", 30);
// 두 객체의 동등성 검사
if (p1.equals(p2)) {
System.out.println("p1과 p2는 동등합니다.");
}
오버라이딩 되지 않는 equals() 는 두 객체의 주소값을 비교한다.
public boolean equals(Object obj) { return (this == obj); }
동일성 을 확인한다.동등성을 비교할 수 있다..equals()와 같이 사용될 경우 동등성 비교가 효율적으로 수행된 수 있다.오버라이딩 되지 않는hashCode() 는 객체의 해쉬 코드를 반환한다.
이 코드는 보통 객체의 메모리 주소를 기반으로 반환된다.
하지만 객체의 메모리 주소는 변경될 수 있음으로 오버라이딩해 객체의 값을 기반으로 수정 할 수 있다.
@HotSpotIntrinsicCandidate
public native int hashCode();
hashCode() 메소드를 할 경우 권고되는 규칙이 있다.
- 동일한 객체에 대해 여러 번 호출되면, 항상 같은 값을 반환해야 합니다.
- 동등한 내용을 가지는 객체에 대해 같은 값을 반환해야 합니다.
- 동등하지 않은 내용을 가지는 객체에 대해서는 서로 다른 값을 반환해야 합니다.
- 가능하면 해시 충돌을 최소화하는 방법으로 구현해야 합니다.
만약 이렇게 오버라이딩 하게 된다면 객체의 메모리 주소가 아닌 객체의 값을 비교하게 될 수 있기 때문에.
동일성이 아닌 동등성을 검색하게 되는 경우도 있을 것 같다.