자바에서 동등성과 동일성은 객체의 비교와 관련된 두 가지 중요한 개념이다.
이 두 개념은 객체를 비교할 때 매우 중요한 역할을 한다.
1. 동등성 (Equality)
동등성은 두 객체가 논리적으로 같은지를 판단하는 개념. 자바에서 동등성을 비교할 때 주로 equals() 메서드를 사용한다. equals() 메서드는 객체의 논리적 동등성을 비교하는 데 사용되며, Object 클래스에서 기본적으로 정의되어 있다.
기본 동작
Object 클래스의 기본 equals() 메서드는 객체의 참조를 비교한다. 즉, 두 객체가 동일한 메모리 주소를 참조하는지를 비교한다. 이는 객체의 실제 내용을 비교하지 않는다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true; // 동일한 객체 참조
}
if (obj == null || getClass() != obj.getClass()) {
return false; // 클래스가 다르거나 null
}
Person person = (Person) obj;
return age == person.age && name.equals(person.name); // 필드 비교
}
}
주요 규칙
equals() 메서드를 오버라이드할 때는 다음과 같은 규칙이 있다:
- 반사성 (Reflexive): 객체 자신과 비교할 때는 항상 true를 반환함. (a.equals(a)는 true이어야 함)
- 대칭성 (Symmetric): 두 객체가 서로 동등한 경우, 두 객체 모두 서로 동등하다고 판단함. (a.equals(b)가 true면 b.equals(a)도 true이어야 함)
- 추이성 (Transitive): 두 객체가 서로 동등하고, 그 객체들이 또 다른 객체와 동등할 경우, 이들 모두 서로 동등해야 함. (a.equals(b)와 b.equals(c)가 true일 때 a.equals(c)도 true이어야 함)
- 일관성 (Consistent): 객체의 상태가 변하지 않는 한, 여러 번의 호출에서도 항상 일관된 결과를 반환함.
- null에 대한 비동등성 (Non-nullity): 객체와 null을 비교할 때는 항상 false를 반환함. (a.equals(null)은 false여야 함)
2. 동일성 (Identity)
동일성은 두 객체가 메모리 상에서 동일한 위치를 참조하는지를 판단하는 개념이다. 자바에서 동일성은 == 연산자를 사용하여 비교합니다. 이는 두 객체가 동일한 메모리 주소를 가지고 있는지를 비교한다.
Person person1 = new Person("Alice", 30);
Person person2 = new Person("Alice", 30);
Person person3 = person1;
System.out.println(person1 == person2); // false: person1과 person2는 다른 메모리 주소를 가짐
System.out.println(person1 == person3); // true: person1과 person3은 같은 메모리 주소를 가짐
동등성과 동일성의 차이
- 동등성 (equals()): 두 객체가 논리적으로 동일한지를 비교한다. 보통 객체의 상태나 내용을 기준으로 비교한다.
- 동일성 (==): 두 객체가 메모리 상에서 동일한 인스턴스를 참조하는지를 비교한다.
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Alice", 30);
Person p2 = new Person("Alice", 30);
Person p3 = p1;
System.out.println("p1 == p2: " + (p1 == p2)); // false
System.out.println("p1 == p3: " + (p1 == p3)); // true
System.out.println("p1.equals(p2): " + p1.equals(p2)); // true
// 동일한 객체 참조 확인
System.out.println("p1.equals(p3): " + p1.equals(p3)); // true
}
}
위의 코드에서 p1과 p2는 내용적으로 같지만, 서로 다른 인스턴스이기 때문에 p1 == p2는 false이다. p1과 p3는 동일한 인스턴스이므로 p1 == p3는 true이다. equals() 메서드를 오버라이드하여 객체의 논리적 동등성을 비교하면, p1.equals(p2)는 true가 된다.
이와 같이, 동등성과 동일성은 자바에서 객체를 비교할 때 중요한 개념이며, 올바른 비교를 위해서는 두 개념을 잘 이해하고 적절하게 사용해야 한다.
'Java 문법정리 (Array부터)' 카테고리의 다른 글
패턴 매칭(Pattern Matching) (0) | 2024.12.11 |
---|---|
Enum (0) | 2024.08.01 |
Interface (0) | 2024.07.31 |
Calendar(java 8이후는 java.time) (0) | 2024.07.26 |
기본형 매개변수, 참조형 매개변수 (2) | 2024.07.23 |