hashCode() & toString()

0

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
profile
백엔드를 공부하고 있습니다.

0개의 댓글