Java 기초 정리 - 동등성과 동일성

Zyoon·2025년 4월 28일

Java 기초정리

목록 보기
22/24
post-thumbnail

💡Equals과 [==]


동등성과 동일성


📘 기본형 변수와 참조형 변수의 비교 방법 차이


물리적비교 : ==

  • 객체가 같은 메모리에 있는지 비교한다.
//기본형 변수
int a = 2;
int b = 2;
System.out.println(a == b); // true

//참조형 변수
String c = new String("hi");
String d = new String("hi");

System.out.println(c == d); // false
  • 기본형 변수는 값을 직접 저장하며 주로 Stack 영역에 저장된다.
  • 참조형 변수는 Heap 영역에 저장되며, Stack 영역에는 객체의 주소가 저장되며, 저장 된 값이 같더라도 서로 다른 주소로 객체가 저장되게 된다.
  • 참조형 변수를 == 연산자로 비교하게 되면, Stack 영역에 있는 주소값을 서로 비교하게 되므로 서로 다른 객체로 판별하게 된다.

논리적비교 : eauals()

  • 객체 안에 있는 데이터가 같은지 비교한다.
//참조형 변수
String a = new String("hi");
String b = new String("hi");

System.out.println(a.equals(b)); // true
  • 객체의 주소값은 다르지만 내부의 값(내용)은 같기 때문에 true 반환

Object 비교

  • Object 클래스의 기본 equals()==와 동일하게 동작한다.
  • 그래서 직접 재정의(Override) 해야 논리적 비교가 제대로 작동한다.
//eauals() 와 hashCode() 모두 재정의 해야한다.
@Override
public boolean equals(Object o) {
    if (o == null || getClass() != o.getClass()) return false;
    Item item = (Item) o;
    return Objects.equals(this.name, item.name);
}

@Override
public int hashCode() {
    return Objects.hashCode(name);
  • 이렇게 재정의 해야 equals() 가 논리적으로 제대로 판별을 하게되며, Map, Set 에 중복되어 있는 값도 판별할 수 있다.

hashCode()

  • 객체를 식별하는 정수값(hashCode)을 반환하는 메서드로 HashCode 값이 같으면 객체를 빠르게 찾거나 비교할 수 있다.
  • 즉, hashCode() 로 빠르게 위치를 찾고 , equal() 로 정밀 비교를 한다.
  • 그러므로 equals() 와 같이 재정의 하지 않으면 HashMap, HashSet 같은 데서 이상하게 동작하게 된다.
  • 두 객체가 같다면 HashCode 도 같지만, HashCode 가 같다고 해서 내용이 같지는 않다.
profile
기어 올라가는 개발

0개의 댓글