==
동일성은 두 객체가 정확히 같은 것인지
를 나타내는 개념이다.
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() 메소드를 할 경우 권고되는 규칙이 있다.
- 동일한 객체에 대해 여러 번 호출되면, 항상 같은 값을 반환해야 합니다.
- 동등한 내용을 가지는 객체에 대해 같은 값을 반환해야 합니다.
- 동등하지 않은 내용을 가지는 객체에 대해서는 서로 다른 값을 반환해야 합니다.
- 가능하면 해시 충돌을 최소화하는 방법으로 구현해야 합니다.
만약 이렇게 오버라이딩 하게 된다면 객체의 메모리 주소가 아닌 객체의 값을 비교하게 될 수 있기 때문에.
동일성이 아닌 동등성을 검색하게 되는 경우도 있을 것 같다.