public boolean equals(Object obj) {
return (this==obj);
}
this는 자기자신의 주소, obj는 매개변수로 주어진 객체의 주소를 말한다.
두 객체의 주소값을 비교해서 그 결과를 반환한다.
현재의 코드라면 서로 다른것을 비교해서 false만 나온다.(모든 객체의 주소는 다르기 때문에)
그래서 오버라이딩을 통해 인스턴스 변수의 값을 비교하도록 바꾼다.
class Person {
long id; // 인스턴스 변수
public boolean equals(Object obj) {
if(obj != null && obj instanceof Person) { -- (1)
return id == ((Person)obj).id; -- (2)
} else {
return false;
}
}
Person(long id) {
this.id = id;
}
}
( 1 ) 객체가 null이 아니고 Person으로 형변환이 가능할 때만 비교한다.
( 2 ) object클래스에는 id가 선언되어 있지 않기 때문에 Person타입으로 형변환한다음 비교한다.
Person p1 = new Person(8011081111222L);
Person p2 = new Person(8011081111222L);
System.out.pritln(p1==p2); -- (3)
System.out.pritln(p1.equals(p2)); -- (4)
( 3 ) 등가비교 연산자는 변수에 저장된 값을 비교하기 때문에 주소같이 다른 두 객체는 false가 나온다.
( 4 ) 두 객체의 id값이 같기 때문에 true가 나온다.
객체의 해시코드(int타입의 정수)를 반환하는 메서드(해시함수)
다량의 데이터를 저장&검색하는 해싱기법에 사용된다.
Object클래스의 hashCode()는 객체의 내부주소를 반환한다.
public class object {
...
public native int hashCode();
equals()를 오버라이딩하면, hashCode()도 같이 오버라이딩 해야한다.(필수 X)
equals()의 결과가 true인 두 객체의 hash code는 같아야하기 때문
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
객체를 문자열로 표현해서 반환하는 하는 메서드
객체가 가지고 있는 인스턴스 변수들의 값을 문자열로 변환해서 반환하는 것이 보통
class Card {
String kind;
int number;
Card() {
this("SPADE", 1);
}
Card(String kind, int number) {
this.kind = kind;
this.number = number;
}
}
class CardToString
{
public static void main(String[] args)
{
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}
오버라이딩 전
public String toString() {
return getClass().getName() + "@"
+ Integer.toHexString(hashCode());
}
실행결과
Card@47e553
Card@20c10f
오버라이딩 후
public String toString() {
return "kind : " + kind + ", number : " + number;
}
실행결과
kind : SPADE, number : 1
kind : SPADE, number : 1