hashCode()
: 객체의 해시코드(hash code)를 반환하는 메소드
↳ 해시코드 : 정수값, 해시 알고리즘에서 사용
- Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
public class Object { public native int hashCode(); //native: 네이티브 메소드, OS의 메소드(주로 c언어로 작성) // {}내용이 없는 이유는 이미 os가 작성해놓은 메소드를 사용하기 때문임. // C언어로 작성된 메소드가 마치 java로 작성된 메소드인 것 처럼 쓸 수 있음.(JNI : 자바가 아닌 언어를 호출할 수 있는 기능)
- OS에 작성돼있는 메소드가 객체의 주소를 int로 변환해서 반환해줌.
↳ 주소를 이용하기 때문에 객체마다 다른 값을 가짐 ⇒ ∴ 해시코드를 객체의 지문이라고도 함
equals()를 오버라이딩하면, hashCode()도 오버라이딩 해야 한다.
↳ 공통점 : 주소를 가지고 작업 → equals가 iv를 이용해서 작업하게 하면, hashCode도 iv 사용하게 오버라이딩 해줘야 함.
⇒ ∵ !! equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문 !!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 위와 동일
↱ 대부분 hashCode를 오버라이딩해서 쓰는데, 오버라이딩하지 않고 기본 기능만 사용할 때 이 코드를 이용
( 객체마다 다른 해시코드 값이 필요할 때)
System.identityHashCode(Object obj)
는 Object클래스의hashCode()
와 동일 <참고>
: 객체마다 다른 해시코드를 반환하는 메소드System.out.println(System.identityHashCode(str1)); //3526198 System.out.println(System.identityHashCode(str1)); //7699183
toString()
: 객체를 문자열(String)으로 변환하기 위한 메소드
public String toString() { // 아래 return값이 Object클래스의 toString() return getClass().getName() + "@" + Integer.toHexString(hashCode()); } // getClass: 설계도 객체를 반환하는 메소드, getName: 클래스, 객체의 이름을 반환 // @ : at 위치, Integer.toHexString : 16진수
↳결과 값:
클래스이름@주소값
/Card@19e0bfd
→ 주소를 출력하는 것, 결과값이 유용하지 않음.
⇒ 오버라이딩 진행public String toString() { return "kind : " + kind + ", number :" + number; } // iv값인 kind와 number을 출력하도록 오버라이딩!
↳결과 값:
kind : SPADE, number : 1
→ 객체가 가지고 있는 iv값을 출력하는 것이 더 유용함왜 iv값을 이용??
: 객체 == iv 집합,
객체 → 문자열로 변환 == iv의 값 → 문자열로 변환
∴ 객체를 문자열로 변환(오버라이딩)하기 위해서 iv값들을 이용함.
↳ 반드시 이 방법을 이용해야 하는 것은 아니지만, 일반적인 방법이다.
출처
- 자바의 정석 기초편 : ch9- 4~6