티스토리 뷰
hashCode
- 객체의 해시코드(hashCode)를 반환하는 메서드
- Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
- equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다. ⭐️
- equals의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다. ⭐️
- System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일
public class Object { // 해시코드 : 정수값 반환, 해싱 알고리즘(11장 컬렉션 프레임 웍)
... // native메서드 : OS의 메서드(C언어), JNI
public native int hashCode(); // 내용 x, 객체마다 다른 값을 반환하기 때문에 '객체의 지문'이라 함
} // Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.hashCode()); // 96354
System.out.println(str2.hashCode()); // 96354
// equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.
// equals의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문 ⭐️
String클래스의 equals()와 hashCode()는 오버라이딩이 잘 되어 있는 상태다.
| 참고 | identityHashCode()
System.out.println(System.identityHashCode(str1)); // 3526198
System.out.println(System.identityHashCode(str2)); // 7699183
// System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일
참고로, identityHashCode라는 것이 있는데, Object클래스의 hashCode() 동일한 메서드이다. 우리는 대부분 hashCode()를 오버라이딩 하지만, 오버라이딩 하기 이전에 hashCode가 필요할 때 identityHashCode()를 사용한다. 이름에서 유추 가능하듯, 객체마다 다른 해시코드를 반환하는 메서드이다. str1, str2에 대해 identityHashCode()를 호출하면 위와 같은 값들이 나온다.
원래 hashCode라는 건, 객체의 주소값을 이용해서 값이 나오기 때문에, 객체마다 값이 다르다. 그런데, eqauls()를 주소값이 아닌 iv를 가지고 비교하도록 오버라이딩하면, hashCode()도 오버라이딩해야 하기 때문에 그 기능이 없어지는 것이다. 그럴 때 원래대로 객체마다 다른 해시코드 값이 필요할 때 identityHashCode메서드를 사용한다.
32bitJVM에서는 주소가 int값(4byte)이지만 64bitJVM에서 주소 값이 8byte이기 때문에 long이다. 해시코드가 겹치는 상황이 발생할 수도 있다.
toString(), toString()의 오버라이딩
- toString() : 객체를 문자열(String)로 변환하기 위한 메서드
public String toString() { // Object클래스의 toString()
return getClass().getName() + "@" + Integer.toHexString(hashCode());
// 설계도객체 클래스이름 at:위치 16진수 객체주소
}
예제 9-4
Ex9_4 실습하기

객체를 문자열로 변환한다는 것은 'iv'를 문자열로 변환한다는 것과 같다. (객체 : iv 집합이기 때문)
실습 목록
- Object클래스의 toString() 오버라이딩
- Object클래스의 equals() 오버라이딩
- Object클래스의 hashCode() 오버라이딩
- 오버라이딩한 hashCoder()메서드를 주석처리하고, 다시 hashCode()값을 출력하면 오버라이딩하기 전의 값이 나오는지
Objects클래스
Objects클래스는 객체와 관련된 유용한 메서드를 제공하는 유틸 클래스
가변인자
매개변수가 가변인자(Object...)라서 호출시 지정하는 값의 개수가 정해져 있지 않다.
'Java의 정석_기초편' 카테고리의 다른 글
String생성자 (0) | 2022.10.26 |
---|---|
String클래스, 문자열 비교, 빈 문자열 (0) | 2022.10.26 |
Object클래스와 equals() (0) | 2022.10.26 |
사용자 정의 예외 만들기 & 예외 되던지기 & 연결된 예외 (0) | 2022.10.26 |
메서드에 예외 선언하기 & finally블럭 (0) | 2022.10.25 |