Object - equals(), hashCode(), toString()

dy7888·2023년 8월 26일
0

✅ equals()

두 객체의 값이 같은지 다른지에 대한 boolean 값을 반환해주는 메소드

String strA = new String("abc");
String strB = new String("abc");

System.out.println(strA == strB); // false
System.out.println(strA.equals(strB)); //true

이와 같이 물리적으로 메모지 주소가 같지 않더라도, 값이 동일하면 true를 반환.
equal() 메소드를 오버라이딩하는 주목적은 물리적으로 다른 메모리 주소를 갖는 객체더라도, 논리적으로 동일한지 여부를 반환하기 위해서다.

equals()와 ==차이

==은 주소값 비교이고, equals는 값 비교이다.

String을 생성할 때, 리터럴을 사용하게 되면 string constant pool이라는 영역에 존재하게 되고, new를 통해서 String을 생성하면 Heap 영역에 존재하게 된다.

== 연산자

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1 == s2) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}

➡ 결과: 두개의 값이 같지 않습니다.
== 연산자로 비교한 두 대상은 다르다는 결론이 나온다. == 연산자의 경우 동일한 객체를 참조하는지 아닌지를 알아볼 때 사용이 된다. 그래서 자바에서 문자열 값을 비교하려면 equals()라는 메소드를 활용해서 비교해야 한다.

equals()

public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1.equals(s2)) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}

➡ 결과: 두개의 값이 같습니다.
equal()를 사용하면 두 대상의 데이터 값을 비교하기 때문에 같다는 결론이 나온다.


✅ toString()

기본 동작: 객체의 해시코드 출력
override 목적: 객체의 정보를 문자열 형태로 표현

toString()의 원형

getClass().getName() + '@' + Integer.toHexString(hashCode())

public class Book {

    private String title;
    private String author;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public static void main(String[] args) {

        Book book = new Book("깊은 밤 부엌에서", "모리스 샌닥");
        System.out.println(book);
    }
}

출력 결과

package명.StringStudy$MyObject@3f0ee7cb
toString()을 override 하지 않고 출력하면 클래스풀네임@해시코드가 출력된다.

toString()의 활용

public class Book {

    private String title;
    private String author;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    @Override
    public String toString() {
        return "title=" + title + ", author=" + author;
    }

    public static void main(String[] args) {

        Book book = new Book("깊은 밤 부엌에서", "모리스 샌닥");
        System.out.println(book);
    }
}

실행 결과

title=깊은 밤 부엌에서, author=모리스 샌닥

✅ hashCode()

hashCode()는 객체의 메모리 주소를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.
기본 동작으로는, JVM이 인스턴스를 생성할 때 메모리 주소를 10진수로 변환하여 해시코드를 부여한다.

Drink drink1 = new Drink("삼다수", "물");
Drink drink2 = new Drink("오아시스", "물");

System.out.println(drink1.hashCode()); // 1057941451
System.out.println(drink2.hashCode()); // 1975358023

hashCode()의 활용

overrode 목적: 서로 다른 메모리에 위치한 객체가 동일성을 갖기 위해서
보통 equal()와 hashCode()는 함께 override한다.

public static class Drink{
  private String name;
  private String kind;

  public Drink(String name, String kind) {
      this.name = name;
      this.kind = kind;
  }

  public String getKind() {
      return kind;
  }

  @Override
  public boolean equals(Object obj) {

      if (obj instanceof Drink) {
          return this.getKind() == ((Drink)obj).getKind();
      } else {
          return false;
      }
  }

  @Override
  public int hashCode() {
      return getKind().hashCode();
  }

}
System.out.println(drink1.hashCode()); // 47932
System.out.println(drink2.hashCode()); // 47932

동일한 해시코드 값이 출력된다.

profile
나의 기록하는 개발 일지

0개의 댓글