본문 바로가기
개발자 일지/Java

[java] 동일성, 동등성 개념 및 equals, hashCode

by 네빌링 2024. 10. 16.
반응형

최근 JPA 강의를 듣던 중 동일성과 동등성 개념 및 equals, hashCode에 대한 내용이 나왔습니다.

예전에 배웠지만 또 가물가물해서 이번 기회에 제대로 정리해보려고 합니다.

 

JAVA-동일성-동등성-equals-hashCode-썸네일

 

[목차]

  1. 동일성이란?
  2. 동등성이란?
  3. equals와 hashCode
  4. 동일성/동등성 테스트 예제

1. 동일성이란?

자바에서 동일성(Identity)이란 '==' 연산자를 사용하여 두 객체가 같은 메모리 주소를 참조하는지를

비교하는 것을 의미합니다.

즉, 두 객체가 메모리상에서 동일한 위치에 있는지 판단하는 것입니다.

그래서 같은 타입이고 같은 값을 가지고 있더라도, 메모리 주소가 다르면 false를 반환하게 됩니다.

 
String str1 = new String("hello"); 
String str2 = new String("hello"); 
System.out.println(str1 == str2); // false (서로 다른 객체이므로)

 

2. 동등성이란?

 

동등성(Equality)은 객체의 을 비교하는 개념입니다.

즉, 두 객체가 같은 값을 가지고 있는지를 판단하는 것이죠.

자바에서는 기본적으로 Object 클래스의 equals() 메서드를 상속받기 때문에,

이를 재정의하지 않으면 equals()는 동일성과 같은 방식으로 작동합니다.

 

그래서 객체의 을 기준으로 비교하고 싶다면 equals() 메서드를 재정의해야 합니다.

예를 들어, 문자열이 동일한지 비교할 때 equals() 메서드를 사용하는 것이죠.

 
System.out.println(str1.equals(str2)); // equals를 재정의했다면 true (값이 동일하므로)

 

3.equals와 hashCode

 

자바에서 hashCode()와 equals()는 동등성을 올바르게 구현하기 위해 함께 재정의되어야 합니다.

특히, 해시 기반 컬렉션(HashSet, HashMap)에서는 해시 값을 사용하여 객체를 저장하므로,

두 객체가 같은 값을 가지고 있다면 동일한 해시코드를 반환해야 합니다.

 

hashCode()는 객체의 해시값을 반환하며, 동등성이 있는 두 객체는 같은 해시코드를 가져야 합니다.

만약 hashCode()를 재정의하지 않으면 해시 기반의 컬렉션에서 예상치 못한 동작이 발생할 수 있습니다.

 

이 때문에 equals()를 재정의할 때는 반드시 hashCode()도 함께 재정의해야 합니다.

 

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null || getClass() != obj.getClass()) return false;
    Person person = (Person) obj;
    return Objects.equals(name, person.name);
}

@Override
public int hashCode() {
    return Objects.hash(name);
}
 
 

4. 동일성/동등성 테스트 예제

 

간단한 예제를 통해 동일성과 동등성을 테스트 해보겠습니다.

 

class Person {
    String name;
    
    Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

public class EqualsTest {
    public static void main(String[] args) {
        Person person1 = new Person("John");
        Person person2 = new Person("John");

        // 동일성 테스트 (==)
        System.out.println(person1 == person2); // false (다른 객체)

        // 동등성 테스트 (equals)
        System.out.println(person1.equals(person2)); // true (동등성 보장)
    }
}

 

동일성과 동등성, 그리고 equals()와 hashCode() 메서드에 대해 살펴봤습니다.

이러한 개념을 확실히 이해하고 활용하면, 실무에서 객체 비교 시 불필요한 디버깅 시간을 줄일 수 있습니다.
 

감사합니다!

반응형