equals()와 hashCode() 차이점

정병웅·2023년 2월 14일
0

자바

목록 보기
3/8

면접 준비를 하다가 자바 지식이 너무 부족해서 여기저기 구글링하면서 찾아보다가 흥미로운 글을 읽어서 머릿속으로 한번 정리해보기 위해서 작성해 보았다 사실 equasl는 많이 써보아서 익숙하지만 hashCode는 처음 보아서 더 흥미로웠던 것 같다.

equals

-> 두 객체가 동일한지 확인하는 method
Object 클래스의 내용에서 아래와 같이 구현 되어 있다.

    public boolean equals(Object obj) {
        return (this == obj);
    }

'==' 으로 비교하는데 해당 비교는 주소값을 비교하게 된다.
여기서 좀 의아했다,,, 분명 나는 equals를 문자열과 비교하면서 많이 썼는데 오히려 주소값을 비교한다고 했기 때문이다.

해답은 아래에 있다,,!

String을 비교할 경우 아래 코드와 같이 결과 값이 true로 나온다.

String aa = "cc";
        String bb = "cc";
        System.out.println(aa.equals(bb)); 
        
        //결과 true

원래는 주소값을 비교해야하기 때문에 결과 값이 false 로 나와야하지만 String의 equals는 오버라이드(재정의) 되어 있기 때문에 위에서 설명된 object의 equals 와는 다르다.

결론

object의 equals와 String의 equals는 다르며, Object의 equals는 주소값을 비교, String의 equals는 문자열을 비교한다.

hashCode()

객체의 hashCode를 리턴한다.
hashcode는 일반적으로 각 객체의 주소값을 변환하여 생성한 객체의 고유한 정수 값을 뜻하고, 두 객체가 동일 객체인지 비교할 때 사용한다.

사용이유

객체를 비교할 때 드는 비용을 낮추기 위함.
두 개를 비교할 때는 equals를 사용하면 integer를 비교하는 것에 비해 많은 시간이 소요된다.
hashCode는 integer 이다.
보통 hashMap에서 hashCode를 이용해서 객체를 매핑하여 객체를 찾을 때 사용한다.
1. 객체를 비교할 때 우선 hashCode를 사용하여 객체가 절대 같을 수 없는 경우를 확인
2. hashCode가 같을 때는 equals로 두 객체가 같은지 비교

주의,,,!

public class Main{
	public static void main(String[] args){
		String str1 = "hello";
		String str2 = "hello";
		String str3 = "world";
		System.out.println(str1.hashCode()); //123
		System.out.println(str2.hashCode()); //123
		System.out.println(str3.hashCode()); //456
	}
}

str1과 str2는 문자열은 같지만 주소값은 다르다. 하지만 hashCode() 에서는 같다고 출력된다.
즉, String에서는 중복 가능성이 있다.

마무리,,,
equals는 ‘==’ 과 동일결과를 리턴, 동등성을 띄고 있으며, 동등은 둘의 참조값이 다르더라도 객체 내부 value는 같다는 것을 의미한다.

hashCode는 객체의 주소값을 비교한다.

  1. hashCode() 메서드를 실행해서 해당 객체가 같은 주소값(해시 코드 값)을 참조하는지 비교
  2. 같다면, equals() 메소드로 다시 비교하여 hashCode()와 equals()가 모두 맞아야 동등 객체로 판단 한다.
profile
인생은 IT 노가다

0개의 댓글