== 연산자는 Primitive type은 값을 비교하고 Reference type은 주소를 비교한다.
ex)
int a = 10;
int b = 10;
a == b // true
String s1 = new String("abc");
String s2 = new String("abc");
s1 == s2 // false
첫 번째의 경우에는 primitive type이니까 값을 비교해서 둘 다 10이니까 true이고,
두 번째의 경우에는 reference type이니까 참조값을 비교하는데 s1, s2각각 객체를 생성했기 때문에 참조값이 다르니까 false가 나온다.
equals 메서드는 Object 클래스에 정의된 기본 구현에서는 ==와 동일하게 참조를 비교하지만 오버라이딩 했을 때는 두 객체의 내용이 논리적으로 같은지를 비교한다.
ex) 기본 equals
class Person {
String name;
Person(String name) { this.name = name; }
}
Person p1 = new Person("sejin");
Person p2 = new Person("sejin");
p1.equals(p2)
위 코드의 경우 equals의 결과는 equals메서드를 오버라이딩 하지 않고 사용했으므로 값이 아니라 ==와 같이 참조값을 비교한다. 그래서 false가 나온다.
ex) 오버라이딩 equals
String s1 = new String("sejin");
String s2 = new String("sejin");
s1.equals(s2)
위 코드의 경우 String은 equals메서드를 오버라이딩해서 사용하므로 참조값이 아니라 논리적인 값을 비교한다. 그래서 true가 나오게 된다.
컬렉션, Wrapper 클래스 등이 equals 메서드를 오버라이딩한다.