반응형

.equals()

  • 두개의 객체가 같다라는 의미 ? => 속성이 같다는 의미로 해석
  • .equals() 함수 소스를 보면 두 개의 객체를 비교할 때 비교연산자(==)를 사용하여 비교를 함
  • == 연산자는 속성의 주소값(쉬운말로 방번호)을 비교를 함

String 객체에서 어떻게 비교를 해야할까?

.equals() 함수를 재정의하여 비교연산자(==) 대신 값을 비교하도록 재정의함

즉, 두 개의 객체를 비교할 때 속성을 비교할 수 있게 equals() 함수를 재정의하여 사용해야함!

 

JAVA 언어의 최고 조상 객체는 Object 객체이며 Object 객체의 메서드 종류는 .equals(), .hashCode(), .toString()등이 있음

 

JAVA에서 모든 객체(클래스)는 Object 를 상속받고 있음 (extends 라는 키워드는 생략)

 

예제1

public class Member {
//    TODO : 속성, 생성자함수, 메서드
//    속성
    public  String id;

//    생성자
    public Member(String id) {
        this.id = id;
    }

//    객체 동등 비교를 위해 .equals 함수 재정의 해야함 : alt + insert
//    TODO : 인텔리제이 자동코딩
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Member member = (Member) o;
//        return Objects.equals(id, member.id);       // 객체 속성 동등비교
//    }

//    TODO : 참고, 개발자 직접코딩
    @Override
    public boolean equals(Object o) {

//        1) 매개변수 o 객체가 Member 인가?
        if(o instanceof Member) {
//            강제 형변환
            Member member = (Member) o;
//        2) 속성의 값(id) 비교 같으면 true, 아니면 false
            if(this.id.equals(member.id)) {
                return true;
            }
        }
        return false;
    }

}

실행클래스

 

public class MemberApplication {
    public static void main(String[] args) {
//       Member 객체 2명 생성
        Member member = new Member("blue");
        Member member2 = new Member("blue");

//        객체 2명 비교
        if(member.equals(member2)){
            System.out.println("같습니다.");
        } else {
            System.out.println("다릅니다.");
        }


    }
}

결과

 

같습니다.

 

.hashCode()

*          해쉬코드(hashCode)? : 객체를 식별하는 유일한 정수값(번호 중복 없음)
*          1) 방번호(주소) : 메모리의 랜덤하고 유일한 방번호 만들때 사용
*          2) HashMap, HashSet 자료구조에서 내부적으로 해쉬코드를 사용함(객체들을 비교할때)
*          TODO => 기본 hashCode는 객체간 비교에서 오류를 일으키므로 재정의 해야함!
*            결론 ) .equals(), .hashCode() 재정의해야함 (추천 : 자동코딩 기능이용)

예제2

public class Member {
//    속성
    public String id;

//    생성자
    public Member(String id) {
        this.id = id;
    }

//    equals, hashCode 재정의
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Member member = (Member) o;
        return Objects.equals(id, member.id);
    }

    @Override
    public int hashCode() {
//        2개의 객체를 생성해서 비교시 id 속성의 해쉬코드가 2개 모두 같아짐
        return Objects.hash(id);    // 객체의 비교(속성을 비교)
    }
반응형

'Java > Java 이론' 카테고리의 다른 글

예외처리  (0) 2023.09.26
자료구조 - Stack / Queue  (0) 2023.09.26
자료구조  (0) 2023.09.25
MVC 디자인 패턴  (0) 2023.09.22
생성자  (0) 2023.09.20

+ Recent posts