equals()와 hashcode()는 무엇인가?
위의 질문은 자바 프로그래머를 준비하는 사람들이라면 한 번씩 질문 받는 문제이지 않을까 싶다. 실제 위 질문은 기업의 기술 면접에서도 자주 등장한다고 한다. 그래서 이번 포스팅에서는 위의 질문에 대한 답을 찾아 볼까한다.
equals()와 hashcode()
우리가 정의하고 사용하는 모든 객체는 equals()와 hashcode()를 반드시 상속받는다. 그 이유는 무엇일까? 그 이유는 equals()와 hashcode()는 모든 객체의 최상위 객체인 Object에 정의되어 있기 때문이다. 이제 각각의 메서드에 대해 자세히 알아보자.
equals()
//Object - equals
public boolean equals(Object obj) {
return(this == obj);
}
위의 구현 부는 equals()의 구현 부이다. 구현 부를 살펴보면 참조 변수 두 개의 비교에 대한 결괏값을 true/false로 반환해주는 것으로 보인다. 하지만 == 연산자는 서로 다른 두 개의 주솟값을 비교하여 결과를 반환한다. 하지만 프로그래밍 하다 보면 같은 값을 갖는 객체를 동일한 객체로 판단해야 하는 경우가 있다. 즉, 동일한 객체는 아니지만 동등한 객체의 역할이 필요한 상황이 있다는 것이다. 이러한 상황에서 최상위 부모 객체에 구현된 equals()를 오버라이딩하여 사용한다.
hashcode()
//Object - hashCode
public native int hashCode();
hashcode()는 equals()와 마찬가지로 최상위 객체인 Object에 정의된 메서드이다. 저 메서드에서 반환되는 값은 메모리에 생성된 객체의 주소를 정수로 변환한 형태이다. 따라서 생성된 모든 객체는 정수형으로 반환된 주소를 가지고 있다. 이렇게 변환된 정수는 또한 두 객체가 동일한 객체인지를 판단하는 데 사용된다. 그렇다면 두 객체가 같은지를 판단하는데 어떤 연관성이 있을지도 알아보자.
equals()와 hashcode()의 연관성
두 개의 메서드의 연관성에 대해 이해하기 위해서는 동일한 객체로 판단되는 플로우를 알아야 한다. 임의의 두 개의 객체가 동일한지에 대한 판단은 다음과 같은 순서로 진행된다. 우선 정수로 변환된 주솟값의 비교가 선행된다. 여기에서 정수가 다르다면 그 두 개의 객체는 다른 객체이다. 하지만 반환 값이 같다면 그다음에 equals() 메서드를 통해 또 한 번 비교가 이루어진다. 이 과정에서까지 같다는 결과가 나오면 임의의 두 객체는 동일한 객체로 판단할 수 있다.
'Languages > Java' 카테고리의 다른 글
[Java]클래스와 객체 그리고 인스턴스와의 차이 (6) | 2023.01.17 |
---|---|
[JAVA]ArrayList의 동작 및 내부 구현 (2) | 2023.01.13 |
[JAVA]로깅에 System.out.println()을 사용하지 않는 이유 (11) | 2023.01.12 |
[JAVA]Iterator란? (16) | 2023.01.09 |
[JAVA] 생성자(Constructor) (4) | 2023.01.05 |