Java/Java(base)

[Java]Object class toString(), equals(), hashcode()

ID_DI 2021. 12. 2. 01:48

Object 클래스

  • 모든 클래스들의 최상위 클래스
    • 어떤 클래스들이든 간에 다 가지고 있음
    • 클래스를 만들면 자동으로 Object 클래스를 상속받는다.
  • 객체들이 가져야하는 틀//객체라면 가져야하는 모든 틀
  • Object 객체타입을 매개변수로 받는 메소드들은 어떠한 객체든 다 받을 수 있다.
  • 객체를 넘기라는 뜻

toString()

: 객체 출력시 나올 문자열 정의(객체를 대표하는 문자열 정의)

Object 클래스의 toString() 메소드 재정의

public class ObjTest {
    public static void main(String[] args) {
        Test_A obj = new Test_A("Hello");
        System.out.println(obj);
        System.out.println(obj.toString());
    }
}

class Test_A{
    String data;

    public Test_A(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return data;
    }
}
결과:
Hello
Hello

equals()

== 연산자

두 주소값이 같은지 비교

public class StrTest {
    public static void main(String[] args) {

        String msg1 = "Hello";
        String msg2 = "Hello";

        String msg3 = new String("Hello");
        String msg4 = new String("Hello");

        System.out.println("msg1 == msg2 : " + (msg1 == msg2));
        System.out.println("msg3 == msg4 : " + (msg3 == msg4));


    }
}
결과:
msg1 == msg2 : true
msg3 == msg4 : false
  • msg1과 msg2는 "Hello" 값을 담은 String 타입의 객체의 주소값을 동시에 가진다.
  • msg3과 msg4는 각각 생성자를 호출했기 때문에, 각각 "Hello" 값을 담은 String 타입의다른 객체의 주소값을 가진다.

equals()

두 주소값이 같은지 확인하는 메소드

Overriding(재정의) equals()

  1. 매개변수로 들어온 객체가 이클래스 타입인지 비교
  2. 맞다면 다운캐스팅
  3. 조건에 맞춰서 값을 비교

이미 구현되어 있는 사용 예) String class의 Overriding 재정의된 equals() 는 주소값이 아닌 값을 비교한다.

  • 동위객체(주소값이 다른 객체지만, 같은 값을 가진 객체)인지 비교하는 메소드equals()동일객체(주소값이 같은 객체)인지 비교하기 위해 equals()로 재정의
public class Zoo {
    public static void main(String[] args) {
        //두마리의 동물 만들어서 equals로 비교하게 해보기
        Animal dog = new Animal("뽀삐",12);
        Animal dog1 = new Animal("뽀삐",12);

        System.out.println(dog.equals(dog1));



    }
}

class Animal{
    String name;
    int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Animal) { //타입비교
            Animal target = (Animal)obj; //다운캐스팅
            if(this.name.equals(target.name) && (this.age == target.age)) {
                return true;
            }
        }
        return false;
    }
}

hashcode()

해시값(주소값의 16진수 int 값) 리턴



따라서 우리가 만드는 클래스에서는 주소값이 아닌 다른 값으로 비교할 수 있도록 재정의 할 수 있어야한다.