hashcode() equals() toString()

Onni·2021년 8월 10일
1

Object class

모든 클래스의 최고 조상으로 오직 11개의 메서드를 가지고 있다. equals(), hashcode(), tostring() 모두 object 클래스의 메서드

equals()

  • 객체 자신(this)과 주어진 객체(obj)를 비교해 같으면 true 다르면 false를 반환한다.
  • object 클래스의 equal()는 객체의 주소를 비교한다. (참조변수 값 비교)
class Value{
    int value;

    value(int value){
        this.value = value;
    }
}

class test{
    public static void main(String[] args){
        Value v1 = new Value(10);
        Value v2 = new Value(10);
        System.out.println(v1.equals(v2));
    }
}

위 코드의 결과를 살펴보면 v1과 v2의 참조값이 다르기때문에 false를 출력한다.

v1 == v2 -> 0x1234 == 0x2345 -> false

이처럼 Object 클래스의 equals()는 주소를 비교하기 때문에 인스턴수 변수의 값을 비교하도록 오버라이딩 해서 사용

class Value{
    int value;

    value(int value){
        this.value = value;
    }

    public boolean equals(Object obj){
    	//return this==obj // 주소 비교. 서로 다른 객체는 항상 거짓
        // 참조변수의 형변환 전에는 반드시 instanceof로 확인 
        if(!(obj instanceof Value)) return false;
        Value v = (Value)obj;
        return this.value == v.value;
    }
}

class test{
    public static void main(String[] args){
        Value v1 = new Value(10);
        Value v2 = new Value(10);
        System.out.println(v1.equals(v2));
    }
}

v1 = v2 -> this.value == ((Value)obj).id -> 10 ==10 -> true

Object의 equals()를 오버라이딩해서 주소가 아닌 value 값을 비교

hashCode()

  • 객체의 해시코드(hash code)를 반환하는 메서드
  • Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
  • equals()를 오버라이딩하면, hashCode()도 오버라이딩 해야한다.
    => equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문

toString()

  • 객체를 문자열(String)으로 변환하기 위한 메서드
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

기본적으로 toString()은 위와같이 구현되어있기 때문에 아래 코드를 실행하면 Card@19e0bfd 이런식으로 나온다.

class Card{
    String kind;
    int number;

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

class main{
    public static void main(String[] args){
        System.out.println(new Card().toString());
    }
}
  • toString() 오버라이딩
class Card{
    String kind;
    int number;

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

    public String toString(){
        return "kind: " + kind + ", number : " + this.number;
    }
}

오버라이딩 전 : Card@19e0bfd
오버라이딩 후 : Kind : SPADE , number : 1

오버라이딩 전에는 클래스이름@주소가 나왔지만 오버라이딩 후에는 인스턴스 변수를 문자열로 바꿔준다.

profile
꿈꿈

0개의 댓글