최근 JPA 강의를 듣던 중 동일성과 동등성 개념 및 equals, hashCode에 대한 내용이 나왔습니다.
예전에 배웠지만 또 가물가물해서 이번 기회에 제대로 정리해보려고 합니다.
[목차]
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() 메서드에 대해 살펴봤습니다.
감사합니다!
'개발자 일지 > Java' 카테고리의 다른 글
[Java] Logback, SLF4J 기초, 사용 이유, 환경 설정 및 테스트 (0) | 2024.10.04 |
---|---|
멀티쓰레드환경,동시성제어 | AtomicInteger 활용하기 (0) | 2023.10.14 |
[에러]java.lang.Integer cannot be cast to java.lang.String 해결방법 (2) | 2022.05.27 |
[ibatis]SELECT 결과가 이상할 때(remapResults 사용하기) (1) | 2021.04.23 |
[디자인패턴]빌더 패턴(Builder Pattern) (0) | 2021.03.21 |
깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)의 이해 (0) | 2021.03.15 |
[디자인패턴]싱글톤 패턴(Singleton Pattern) (0) | 2021.03.08 |
[디자인패턴]팩토리 메소드 패턴(Factory Method Pattern) (0) | 2021.03.07 |