[JAVA] java.lang패키지와 유용한 클래스 - hashCode(), toString()

선영·2022년 8월 24일
0
post-thumbnail

hashCode()

  • 객체의 해시코드(hash code)를 반환하는 메서드. 해시코드는 객체마다 다른 값을 반환하기 때문에 객체의 지문이라고도 함.
  • Object클래스의 hashCode()는 객체의 주소int로 변환해서 반환
public class Object {
	...
    // native 메서드 : OS의 메서드(C언어)
    public native int hashCode();
  • equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 함. equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문.
  • System.identityHashCode(Object obj) 는 Object클래스의 hashCode()와 동일
    • 오버라이딩 하기 전의 객체 주소를 다시 비교할 때 사용하면 됨.
  • 32bitJVM 에서는 주소값이 int, 64bitJVM 에서는 주소값이 long
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
System.out.println(System.identityHashCode(str1)); //1221555852
System.out.println(System.identityHashCode(str2)); //1509514333

toString(), toString()의 오버라이딩

  • toString() : 객체를 문자열(String)로 변환하기 위한 메서드

    public String toString() {
    return getClass().getName()+"@+Integer.toHexString(hashCode());
    //설계도객체.클래스이름 + at + 16진수(객체주소)
    }

  • 오버라이딩 하기 전
class Card {
	String kind;
	int number;

	Card() {
		this("SPADE", 1);
	}

	Card(String kind, int number) {
		this.kind = kind;
		this.number = number;
	}
}

class Ex9_4 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();

		System.out.println(c1.toString());
		System.out.println(c2.toString());
	}
}

  • Object클래스의 toString()을 오버라이딩
public String toString() {
	return "kind: " + kind +", number: " + number; 
}
...
	System.out.println(c1.equals(c2));

  • equals 오버라이딩
	public boolean equals(Object obj) {
		if(!(obj instanceof Card))
			return false;
		
		Card c = (Card)obj;
		//kind가 Stirng이니깐 ==이 아닌 equals사용 
		return this.kind.equals(c.kind) && this.number==c.number;
	}
	
	// Object클래스의 toString()을 오버라이딩
	public String toString() {
		return "kind: " + kind +", number: " + number; 
	}

  • equals()를 오버라이딩하면 hashcode도 오버라이딩 해줘야함.
    • Objects 클래스는 객체와 관련된 유용한 메서드를 제공하는 유틸 클래스.
    • int hash(Object... values) {...} 매개변수가 가변인자(Ojbect...)라서 호출시 지정하는 값의 개수가 정해져있지 않다.
public int hashCode() {
	return Objects.hash(kind, number);
}
...
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());

  • 이클립스 메뉴 상단에 Source 를 클릭하면 Generate hashcode() and equals()가 있는데 이것을 사용해도 됨.

  • 전체 코드

import java.util.Objects;

class Card {
	String kind;
	int number;

	Card() {
		this("SPADE", 1);
	}

	Card(String kind, int number) {
		this.kind = kind;
		this.number = number;
	}
	
	//equals()를 오버라이딩하면 hashcode도 오버라이딩 해줘야함. 
	public int hashCode() {
		// Objects 클래스는 객체와 관련된 유용한 메서드를 제공하는 유틸 클래스
		// int hash(Object... values) {...} 매개변수가 가변인자(Ojbect)라서 호출시 지정하는 값의 개수가 정해져있지 않다. 
		return Objects.hash(kind, number);
	}
	
	public boolean equals(Object obj) {
		if(!(obj instanceof Card))
			return false;
		
		Card c = (Card)obj;
		//kind가 Stirng이니깐 ==이 아닌 equals사용 
		return this.kind.equals(c.kind) && this.number==c.number;
	}
	
	// Object클래스의 toString()을 오버라이딩
	public String toString() {
		return "kind: " + kind +", number: " + number; 
	}
}

class Ex9_4 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();

		System.out.println(c1.equals(c2));
		System.out.println(c1.hashCode());
		System.out.println(c2.hashCode());
	}
}

0개의 댓글