equals 와 hashCode 는 둘 다 객체의 동등성 비교에 사용되는 메서드입니다. 하지만 두 메서드의 하는 역할과 사용되는 상황에서 차이가 있습니다.
equals()
equals 메서드는 두개의 객체가 논리적으로 동일한지 확인하는 데 사용됩니다. 즉 두객체의 내용(값)이 동일한지 비교합니다. 따라서 equals 메서드를 오버라이딩하여 객체들의 내용을 비교하는 방법을 정의할 수 있습니다.
(대부분의 IDE 에서 equals hashCode 메서드를 오버라이딩 하는 기능을 제공합니다)
예를 들어서, 사용자 정의 클래스에서 equals 를 오버라이딩 할 때는, 보통 객체의 필드들을 비교하여 같은 내용인지를 판단하는 로직을 구현합니다.
해시 함수
hashCode 메서드를 알기 전에 해시 함수에 대한 기본적인 지식이 필요합니다.
해시 함수는 임의의 데이터를 입력 받아 해당 데이터를 고정된 길이의 값으로 매핑하는 함수입니다. 해시 함수는 데이터의 크기에 관계없이 항상 일정한 길이의 해시 코드를 생성합니다. 해시 함수는 주로 데이터의 무결정을 확인하거나, 데이터를 검색하기 위한 용도로 사용됩니다. 해시 함수의 특징은 다음과 같습니다.
1. 단방향 함수 : 해시 함수는 단방향 함수로써, 해시 코드를 원래 데이터로 복원하는 것은 매우 어렵거나 불가능합니다. 이로써 데이터의 보안이나 무결성 검증에 사용될 수 있습니다.
2. 고정된 출력 길이 : 입력 데이터의 크기가 어떻든 상관없이 해시 함수의 출력은 항상 일정한 길이입니다. 예를 들어 A라는 해시 함수의 출력이 256비트로 고정되어 있다면, 입력값이 'a', 'aaaaaaaaaaaaaaaaaa' 일 때 같은 크기의 출력값을 보장합니다.
3. 출력 공간의 희소성 : 많은 입력 데이터가 같은 해시 코드를 생성할 수 있습니다. 이를 해시 충돌이라고 표현하며, 이를 피하기 위해 충돌을 최소화하는 좋은 해시 함수를 선택하는 것이 중요합니다.
4. 효율성 : 좋은 해시 함수는 입력 데이터의 작은 변화에 대해 큰 변화된 출력 값을 생성합니다. 이로써 해시 값을 비교하거나, 검색하는데 효율적으로 사용될 수 있습니다.
5. 일정한 출력 : 동일한 입력에 대해서는 항상 동일한 출력을 생성합니다. 이는 데이터 무결성을 검증하는데 유용합니다.
일반적으로 해시 함수는 데이터의 고유한 표현을 만들어내는 것이 목표이며, 개인정보, 비밀번호 등 다양한 분야에서 사용됩니다.
hashCode()
자바의 hashCode() 메서드는 객체의 해시 코드 값을 반환합니다. 해시 코드는 객체를 구별하는 고유한 정수 값으로 사용됩니다. 일반적으로 해시 코드는 해시 충돌이 발생할 수 있으므로 완벽한 유일성을 보장하지 않습니다. hashCode 메서드의 목적은 해시 기반의 자료 구조(HashSet, HashMap) 에서 객체를 효율적으로 저장하고 검색하기 위한 용도입니다. 따라서 hashCode 메서드를 오버라이딩하여 객체의 필드들을 기반으로 해시 코드 값을 생성하는 로직을 구현해야 합니다.
만약 해시 기반 자료구조(HashSet, HashMap) 를 사용할 경우, equals 가 hashCode 와 함께 오버라이딩 되어야 합니다. Hashset, HashMap 는 내부적으로 데이터 조회, 저장, 수정, 삭제 시 equals, hashCode 메서드를 사용합니다. 즉 두 객체의 equals 결과가 true 라면 해당 객체들의 hashCode 값도 동일해야 합니다. 이렇게 구현함으로써 컬렉션에서 동등한 객체의 중복 저장을 방지하고 검색 성능을 향상시킬 수 있습니다.
'언어 > Java' 카테고리의 다른 글
Primitive 타입과 Reference 타입 (0) | 2023.08.18 |
---|