동일성과 동등성에 대하여

SeungHoon·2024년 6월 20일
0

Java

목록 보기
3/5

동일성

  • 한국말로는 거의 비슷하지만 자바에서는 엄연히 차이가 존재한다.
  • 동일성은 “두 객체가 완전히 같은 객체(동일한 메모리 주소)에 위치하느냐”를 말한다. 자바에서는“==” 연산자로 비교를 한다.
  • Object 클래스에는 equals() 메서드가 존재하는데 내부 구현을 보면 “==” 을 사용함을 알 수 있다.
public boolean equals(Object obj) {
    return (this == obj);
}
  • 따라서 우리가 의도하는 내용물이 같을 때 true 을 반환하려면 equals() 메서드를 재정의하는 것이 필요하다. 재정의는 인텔리제이 기능을 사용하면 되니 외울 필요는 없다.

동등성

  • 동등성은 객체의 주소가 다르더라도, 내용(값)이 같은지 비교하는 것이다.
  • equals() 메서드를 오버라이딩하여 비교한다.
package lecture.objects.inner;

import java.util.Objects;

public class MemberV2 {
    private int memberId;
    private String name;
    private String email;

    public MemberV2(int memberId, String name, String email) {
        this.memberId = memberId;
        this.name = name;
        this.email = email;
    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        MemberV2 memberV2 = (MemberV2) o;
        return memberId == memberV2.memberId && Objects.equals(name, memberV2.name) && Objects.equals(
                email, memberV2.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(memberId, name, email);
    }
}
  • 이때 equals() 을 재정의할 때 hashCode() 도 반드시 재정의 해야 한다. HashMap, HashSet같은 자료형에서는 Object 들을 해시할 때 Object.hashCode() 를 사용해 해시 값을 구하기 때문이다.
  • 이때 재정의할 때 지켜줘야 하는 것이 5가지가 존재한다.
    • 반사성 (Reflexive) : 자기 자신과 비교하면 항상 true를 반환해야 한다.
    • 대칭성 (Symmetric) : x == y 이면 y == x 이다.
    • 추이성 (Transitive) : x == y 이고 y == z 이면 x == z 이다.
    • 일관성 (Consistent) : 객체가 변경되지 않았다면 equals()의 결과는 항상 같아야 한다.
    • x.equals(null)는 항상 false를 반환해야 함.

여기서 등장하는 것이 이펙티브 자바에서도 언급하는 "hashCode()equals()함수를 재정의해라"이다. 반드시

번외

hashCode() 함수는 자바의 최상위 클래스인 Object에서 정의가 되어있는데 그 내용은 다음과 같다.

public class Object {
    public native int hashCode();
}

여기서 native는 C,C++로 작성되어(java로 작성되지 않음) JVM 내부의 네이티브 코드로 작성되어있다는 말이다. native method를 사용하는 이유는 다음과 같다.

  • 시스템 퍼포먼스를 개선하기 위해서.
  • 기계/메모리 레벨의 통신을 위해서.
  • 이미 존재하는 자바가 아닌 코드를 사용하기 위해서.
profile
공유하며 성장하는 Spring 백엔드 취준생입니다

0개의 댓글