동일성? 동등성?

DeadWhale·2023년 2월 25일
0

JAVA

목록 보기
6/10

동일성

==

동일성은 두 객체가 정확히 같은 것인지를 나타내는 개념이다.

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);  }
  • Object에서의 equals는 같은 메모리 주소를 참조하는지 확인 하기 때문에. 동일성 을 확인한다.
  • 하지만 객체의 비교를 위해서는 오버라이딩하여 객체의 “값”을 비교해봐야 한다.
  • equals() 메소드를 오버라이딩하여 객체의 “값”을 비교하도록 변경하면, 객체의 동등성을 비교할 수 있다.
  • hashCode() 메서드를 재정의 해 .equals()와 같이 사용될 경우 동등성 비교가 효율적으로 수행된 수 있다.

오버라이딩 되지 않는hashCode() 는 객체의 해쉬 코드를 반환한다.
이 코드는 보통 객체의 메모리 주소를 기반으로 반환된다.

하지만 객체의 메모리 주소는 변경될 수 있음으로 오버라이딩해 객체의 값을 기반으로 수정 할 수 있다.

@HotSpotIntrinsicCandidate
public native int hashCode();

hashCode() 메소드를 할 경우 권고되는 규칙이 있다.

  1. 동일한 객체에 대해 여러 번 호출되면, 항상 같은 값을 반환해야 합니다.
  2. 동등한 내용을 가지는 객체에 대해 같은 값을 반환해야 합니다.
  3. 동등하지 않은 내용을 가지는 객체에 대해서는 서로 다른 값을 반환해야 합니다.
  4. 가능하면 해시 충돌을 최소화하는 방법으로 구현해야 합니다.

만약 이렇게 오버라이딩 하게 된다면 객체의 메모리 주소가 아닌 객체의 값을 비교하게 될 수 있기 때문에.

동일성이 아닌 동등성을 검색하게 되는 경우도 있을 것 같다.

0개의 댓글