동일성
과 동등성
이 뭘까?
우선 개념적으로 알아보자.
두 개체가 있을 때
동일성(同一性, identity)
은 두 개체가 완전하게 동일하다는 것을 의미한다.
즉, 두 개체는 정확히 같은 것이며, 어떤 면에도 차이가 없다.
예를 들어, “A는 A이다”는 동일성의 예이다.
동등성(同等性, equivalence)
은 두 개체가 서로 다르지만, 어떤 관점에서는 같다는 것을 의미한다.
예를 들어, 1+2
와 2+1
은 서로 다른 식이지만, 두 개체는 3
과 동등하다.
그렇다면 프로그래밍에서 동일성
과 동등성
이 뭘까?
프로그래밍에서의 동일성
은 두 변수가 동일한 객체를 참조할 때 동일성을 사용하며, 두 변수의 값이 같은지 여부를 확인할 때는 동등성
을 사용한다.
자바에서의 동일성
과 동등성
은 다음과 같다.
자바에서 동일성
은 ==
연산자를 사용하여 비교한다.
두 객체의 레퍼런스(참조)가 같은지 확인한다.
즉, 두 객체가 같은 객체를 참조하고 있는지를 비교한다.
String a = new String("Hello");
String b = new String("Hello");
a == b // false
자바에서 동등성
은 equals()
메서드를 사용하여 비교한다.
두 객체의 값(정보)이 같은지 확인한다.
즉, 두 객체가 같은 값을 가지고 있는지 비교한다.
String a = new String("Hello");
String b = new String("Hello");
a.equals(b) // true
아니다.
동등성
을 비교하려면 하나의 작업을 더 해야 한다.
바로 eqauls()
메서드를 재정의(override)
해줘야 한다.
Object 클래스에서 상속받은 equals()
메서드를 사용하며 객체의 동등성
을 비교한다.
즉, ==
연산자와 동일하게 객체의 참조값(레퍼런스)을 비교한다.
따라서, 동등성
을 비교하려면 equals()
을 재정의하여 객체의 내용이 같은지를 비교하는 방식으로 재정의해야 한다.
class MyString {
private String value;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof MyString)) {
return false;
}
MyString myString = (MyString) o;
return Objects.equals(value, myString.value);
}
}
다음과 같이 사용자 정의 클래스인 MyString
클래스의 경우 동등성
을 비교할 때 다음과 같이 equals()
메서드를 재정의 해야 한다.
하지만 이렇게 직접 재구현 코드를 작성하는 것은 매우 번거롭고 실수할 여지가 많다.
따라서 IDE
에서 제공하는 자동완성 기능을 사용하여 equals()
메서드를 재정의 하는 것이 바람직하다.