두 객체의 값이 같은지 다른지에 대한 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
는 값 비교이다.
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()라는 메소드를 활용해서 비교해야 한다.
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()를 사용하면 두 대상의 데이터 값을 비교하기 때문에 같다는 결론이 나온다.
기본 동작: 객체의 해시코드 출력
override 목적: 객체의 정보를 문자열 형태로 표현
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 하지 않고 출력하면 클래스풀네임@해시코드
가 출력된다.
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()는 객체의 메모리 주소를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.
기본 동작으로는, JVM이 인스턴스를 생성할 때 메모리 주소를 10진수로 변환하여 해시코드를 부여한다.
Drink drink1 = new Drink("삼다수", "물");
Drink drink2 = new Drink("오아시스", "물");
System.out.println(drink1.hashCode()); // 1057941451
System.out.println(drink2.hashCode()); // 1975358023
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
동일한 해시코드 값이 출력된다.