자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
equals() 메서드의 기본 동작 (기본 구현)
Object 클래스의 equals() 메서드 기본 코드
public boolean equals(Object obj) {
return (this == obj);
}
- equals() 메서드는 기본적으로 두 객체의 주소(참조값) 를 비교합니다.
- 즉, this == obj일 때만 true를 반환하고, 나머지는 모두 false입니다.
- 따라서 같은 내용의 값을 갖고 있어도 다른 객체이면 false가 됩니다.
예제 1
class Value {
int value;
Value(int value) {
this.value = value;
}
}
public class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
}
}
- v1과 v2는 모두 Value 객체이고, 내부의 value 값은 같지만, 서로 다른 객체입니다.
- 기본 equals()는 참조값(주소)을 비교하기 때문에 v1.equals(v2)는 false를 반환합니다.
- 따라서 출력은 v1과 v2는 다릅니다.
- v1 → 주소: 0x1234, 값: 10
- v2 → 주소: 0x2345, 값: 10
- 주소가 다르므로 equals()는 false.
equals() 오버라이딩 (값 비교를 위한 재정의)
오버라이딩 예제
class Person {
long id;
Person(long id) {
this.id = id;
}
public boolean equals(Object obj) {
if (obj instanceof Person)
return id == ((Person)obj).id;
else
return false;
}
}
- equals()를 직접 오버라이딩 해서 id 값이 같으면 true를 반환하게 했습니다.
- 이로써 주소가 달라도 내부 데이터가 같으면 같다고 판단할 수 있습니다.
예제 2
public class Ex9_2 {
public static void main(String[] args) {
Person p1 = new Person(8011081111222L);
Person p2 = new Person(8011081111222L);
if (p1.equals(p2))
System.out.println("p1과 p2는 같은 사람입니다.");
else
System.out.println("p1과 p2는 다른 사람입니다.");
}
}
- p1과 p2는 서로 다른 객체이지만 id 값이 같으므로 equals()는 true를 반환합니다.
- 출력 결과는 "p1과 p2는 같은 사람입니다."
- p1 → 주소: 0x100, id: 8011081111222
- p2 → 주소: 0x200, id: 8011081111222
- 기본 equals()는 주소 비교라서 false
- 오버라이딩된 equals()는 id 값 비교라서 true
정리
구분 | 기본 equals() | 오버리이딩된 equals() |
비교 대상 | 객체의 주소값 | 객체의 속성 값 (예: id, name 등) |
결과 | 값이 같아도 false | 값이 같으면 true 가능 |
사용 목적 | 객체 동일성(identity) | 논리적 동등성(equality) |
'Java' 카테고리의 다른 글
Object클래스 메서드 - toString() (0) | 2025.06.22 |
---|---|
Object클래스의 메서드 - hashCode() (0) | 2025.06.22 |
Object클래스 (0) | 2025.06.22 |
연결된 예외 (0) | 2025.06.21 |
예외 되던지기 (0) | 2025.06.21 |