hashCode(), equals()
1. 객체의 동등 비교 방법에 대하여
해시 함수(hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터로
매핑해주는 함수이다.
해시함수에 의해 얻어지는 값은 해시값, 해시코드, 해시체크섬 또는 간단하게 해시라고한다.
HashSet, HashMap, Hashtable과 같은 객체들을 사용할 경우 객체가 서로 같은지를
비교하기 위해 equals()메서드와 hashCode()메서드를 호출한다.
그래서 객체가 서로 같은지여부를 결정하려면 두 메서드를 Override(재정의)해야한다.
HashSet, HashMap, Hashtable에서는 객체가 같은지 여부를 데이터를
추가할 때 검사한다.
- equals()메서드는 두 객체의 내용(값이) 같은지 비교하는 메서드이고,
- hashCode()메서드는 두 객체가 같은 객체인지를 비교하는 메서드이다
2. equals()메서드와 hashCode()메서드에 관한 규칙
1. 두 객체가 같으면 반드시 같은 hashcode를 가져야 한다.
2. 두 객체가 같으면 equals()메서드를 호출 했을 때 true를 반환해야한다.
즉, 객체 a, b가 같다면 a.eqauls(b)와 b.eqauls(a) 둘다 true이여야한다.
3. 두 객체가 hashcode가 같다고해서 두 객체가 반드시 같은 객체는 아니다.
하지만, 두 객체가 같으면 반드시 hashcode가 같아야 한다.
4. equals()메서드를 override하면 반드시 hashCode()메서드도
override하여야한다.
5. hashCode()는 기본적으로 Heap에 있는 각 객체에 대한 메모리 주소 매핑 정보를
기반으로 한 정수 값을 반환한다. 그러므로, 클래스에서 hashCode()메서드를
override하지 않으면 절대로 두 객체가 같은 것으로 간주될 수 없다.
- hashCode()메서드에서 사용하는 '해싱 알고리즘' 에서 서로 다른 객체에
대하여 같은 hashcode값을 만들어 낼 수 있다.
그래서 객체가 같지 않더라도 hashcode가 같을 수도 있다.
* equals()와 hashCode()메서드는 Object에 정의되어 있는 메서드들이다.
3. Map
1. key값과 value값을 한 쌍으로 관리하는 객체
2. key값은 중복을 허용하지 않고 순서가 없다. (Set의 특징)
3. value값은 중복을 허용한다. (List의 특징)
- 자료 추가 : put(key, value)
- 자료 수정 : put(수정할key, value)
- 자료 삭제 : remove(삭제할 key값)
- 자료 읽기 : get(key값)
- key값들을 읽어와 자료를 출력하는 방법
- 방법 1 : keySet()메서드 이용, Map의 key값들만 읽어와 Set형으로 반환한다.
- 방법 2 : Set형의 데이터를 '향상된 for문'을 이용하여 처리한다.
Cf. iterable을 구현한 객체라면 '향상된 for문'을 사용할 수 있다.
- 방법 3 : value값만 읽어와 출력하기, values()메서드 이용, 거의 안씀
- 방법 4 : Map에는 Entry라는 내부 클래스가 만들어져 있다. 이 Entry클래스에는 key와 value라는 멤버변수로 구성되어 있다. Map에서 이 Entry클래스들을 Set형식을 저장하여 관리한다.
- Entry객체 전체를 가져오기(가져온 Entry들은 Set형식으로 되어있다.)
entrySet()메서드를 이용하여 가져온다.
- 가져온 Entry객체들을 순서대로 처리하기 위해서 Iterator객체를 가져온다.
4. Properties
- Properties는 Map보다 축소된 기능의 객체라고 할 수 있다.
- Map은 모든 형태의 객체 데이터를 key와 value값으로 사용할 수 있지만
- Propertices는 key와 value값으로 String만 사용할 수 있다.
- Map은 put(), get()메서드를 이용해서 데이터를 입출력 하지만
Properties는 setProperty(), getProperty()메서드를 통해서 데이터를 입출력한다.