240801_Object클래스_equals()
equals() - 1. 동일성과 동등성
-
Object는 동등성 비교를 위한 equals() 메서드를 제공함
자바는 두 객체가 같다라는 표현을 2가지로 분리함
→ 동일성(Identity)
"동일"은 완전히 같음
→ 동등성(Equality)
"동등"은 같은 가치나 수준을 의미 but 그 형태나 외관등이 완전히 같지 않을 수 있음.
-
동일성은 물리적으로 같은 메모리에 있는 객체 인스턴스인지 참조값을 확인
동등성은 논리적으로 같은지를 확인
-
동일성은 자바 머신 기준이고 메모리의 참조가 기준이므로 물리적
동등성은 보통 사람이 생각하는 논리적인 기준에 맞추어 비교
-
User a = new User("id-100"); // 참조 x001 User b = new User("id-100"); // 참조 x002
동일성(참조값)은 다르지만 동등성(논리적)은 같다.
String a = "hello"; String b = "hello";
문자의 경우도 마찬가지
-
public boolean equals(Object obj) { return (this == obj); }
object가 기본적으로 제공하는 비교는 동일성비교(==)으로 제공하기 때문에 오버라이딩을 해야한다.
→ 동등성이라는 개념은 각각의 클래스 마다 다르다. 어떤 클래스는 주민등록번호를 기반으로 동등성을 처리할 수 있고, 어떤 클래스는 고객의 연락처를 기반으로 동등성을 처리할 수 있으며, 어떤 클래스는 회원 번호를 기반으로 동등성을 처리할 수 있다.
→ 동등성 비교를 사용하고 싶으면 equals() 메서드를 재정의(오버라이딩)해야함
equals() - 2. 구현
-
package lang.object.equals; public class UserV2 { private String id; public UserV2(String id) { this.id = id; } @Override public boolean equals(Object obj) { UserV2 user = (UserV2) obj; //다운캐스팅 return id.equals(user.id); /*boolean result = this.id == user.id; return result;*/ }
→ Object의 equals() 메서드를 재정의함.
→ UserV2의 동등성은 id(고객번호)로 비교한다.
→ equals()는 Object 타입을 매개변수로 사용한다. 따라서 객체의 특정 값을 사용하려면 다운캐스팅이 필요함.
→ 여기서는 현재 인스턴스(this)에 있는 id 문자열과 비교 대상으로 넘어온 객체의 id 문자열을 비교한다.
→ UserV2에 있는 id는 String이므로 문자열 비교는 ==이 아닌 equals()를 사용해야한다.
-
public class EqualsMainV2 { public static void main(String[] args) { UserV2 user1 = new UserV2("id-100"); UserV2 user2 = new UserV2("id-100"); System.out.println("identity = " + (user1 == user2)); System.out.println("equality = " + user1.equals(user2)); } }
결과 값
identity = false
equality = true
-
정확한 equals() 구현
위의 예시는 이해를 돕기 위한 매우 간단하게 한거임 원래는 좀 복잡함.
-
@Override public boolean equals(Object object) { if (this == object) return true; if (object == null || getClass() != object.getClass()) return false; UserV2 userV2 = (UserV2) object; return Objects.equals(id, userV2.id); }
뭔가 굉장하고 복잡함
→ alt + insert 단축키로 equals 자동생성 도움을 받음
-
규칙이 있으나 외울 필요는 없다.
- 반사성 객체는 자기자신과 동등 (x.equals(x)는 항상 true).
- 대칭성 A==B, B==A
- 추이성 A==B, B==C 이면 A==C이다
- 일관성
- null에 대한 비교 시 false를 반환해야함.
→ 실무에서는 대부분 IDE가 만들어주는 equals()를 사용하므로, 이 규칙을 외우기 보다는 이런 내용이 있다 정도로만 인지.
-
정리 :
→ 참고로 동일성 비교가 항상 필요한 것은 아님, 동일성 비교가 필요한 경우에만 equals()를 재정의(오버라이딩)하면 된다.
→ equals() 와 hashCode()는 보통 함께 사용됨. 이부분은 뒤에 컬렉션 프레임 워크에서 배울예정.
→ 다운캐스팅에 대한 문법 복습.
→
※ 실질 공부시간 70 ~ 80분 정도 점차 늘려나갈 예정.
※ 내일은 문제풀이