다시 시작/인프런 실전 자바 - 중급

240801_Object클래스_equals()

eojin_Hyun 2024. 8. 2. 02:01

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 자동생성 도움을 받음

     
  • 규칙이 있으나 외울 필요는 없다.

    1. 반사성 객체는 자기자신과 동등 (x.equals(x)는 항상 true).
    2. 대칭성 A==B, B==A
    3. 추이성 A==B, B==C 이면 A==C이다
    4. 일관성
    5. null에 대한 비교 시 false를 반환해야함.

    → 실무에서는 대부분 IDE가 만들어주는 equals()를 사용하므로, 이 규칙을 외우기 보다는 이런 내용이 있다 정도로만 인지.

     
  • 정리 :

    → 참고로 동일성 비교가 항상 필요한 것은 아님, 동일성 비교가 필요한 경우에만 equals()를 재정의(오버라이딩)하면 된다.

    → equals() 와 hashCode()는 보통 함께 사용됨. 이부분은 뒤에 컬렉션 프레임 워크에서 배울예정.

     

    → 다운캐스팅에 대한 문법 복습.

    → 

     

    ※ 실질 공부시간 70 ~ 80분 정도 점차 늘려나갈 예정.

    ※ 내일은 문제풀이