[JAVA] Object 동일한지 비교( ==연산자, equals(), hashCode() )

2021. 1. 26. 17:41카테고리 없음

728x90


== 연산자

==연산자 ‘는 피연산자가 primitive type(int, double, boolean)일 경우에는 값이 같은지 비교
피연산자가 그 외 객체, reference type일 경우에는 가리키는 주소가 같은지 비교
‘ ==연산자 ‘는 두 객체가 같은 것일 때만 true를 리턴



equals()


equals()는 내용이 같은지를 검사하는 메서드.
기본적으로는 primitive type은 내용이 같은지 비교하고 reference type은 객체의 주소가 같은지 비교.
‘ ==연산자 ‘와 다른 점은 완전히 같은 객체를 가리키지 않아도 개발자가 true를 리턴하도록 만들 수 있다는 것.

* equals()메서드눈 원래 reference type은 객체의 주소값을 비교하기 때문에, reference type인 String클래스도 객체의 주소값을 비교할 것 같지만, String 클래스는 내부적으로 equals()메서드를 오버라이드 해놓았기 때문에 String 객체의 주소값이 달라도 내용이 같다면 true를 리턴.

String 클래스가 아닌 개발자가 생성한 클래스의 객체는 자바가 내용이 같은지를 비교하기 어렵기 때문에, 해당 클래스에 equlas()메서드를 오버라이드하여 두 객체의 내용이 같은지를 정의해 주어야 올바르게 작동할 수 있음.
그런데, 이 때 equals()메서드만 오버라이드 해선 안되고 개발자가 직접 생성한 클래스의 객체가 동일한지를 정확하게 비교하기 위해서는 반드시 equals()메서드와 hashCode()를 함께 재정의 해야함.


hashCode()

hashCode()는 메모리에서 가진 hash주소값을 기본적으로 리턴.
hash는 다른 객체여도 같을 수가 있기 때문에 비교에 적합하지 않지만 hash함수를 쓰는 Collection같은 객체가 있기 때문에 equals()와 함께 재정의 해야한다고 이해하기.



equals()와 hashCode() 재정의시 주의할 점

equals()로 같은 객체라면 반드시 hashCode()도 같은 값이어야하지만, 반대로 hashCode()로 같은 값이어도 equals()로는 다른 객체일 수 있음.
꼭 같은 파라미터를 이용해야함.(실제 equals()의 파라미터는 반드시 Object타입이어야 함.(내부적으로 비교하는 파라미터를 같게하라는 의미) 파라미터 타입을 Object에서 다른 타입으로 변경할 경우 오버로딩으로 인식하여 기존의 equals()메서드가 남아있게 됨.)


참고 : https://jeong-pro.tistory.com/m/172

728x90