개요
자바의 기본 중 하나인 동일성과 동등성에 대해 알아보도록 하겠습니다.
1. 동일성과 동등성이란
동일성은 두 객체가 모두 동일한 곳을 참조하고 있는 것이고, 동등성은 두 객체가 같은 정보를 갖고 있는 것입니다.
가장 간단한 예시를 들자면 String 입니다. String은 매번 할당 시 새로운 String Pool에 만들어집니다.
String str1 = "hello";
String str2 = "hello";
if(str1 == str2){
System.out.println("yes");
} else {
System.out.println("no");
}
Java
복사
위 두 값을 비교하면 "no" 가 나옵니다. 동일한 값을 가지고 있는 것이지 동일한 참조를 갖고 있는 것이 아니기 때문입니다.
대게 객체들의 동등성을 비교할 때 equals를 오버라이딩 합니다.
이 때 equals는 "개발자가 동일한 값이 들어 있다고 판단하는 기준" 에 따라 오버라이딩 되어야 한다고 생각합니다.
예를 들어, 학생 객체가 있다고 가정해보겠습니다.
class Student {
private String name;
private String age;
private String studentId;
...
@Override
public boolean equals(Object obj){
if(this.name == obj.name && this.age == obj.age){
return true;
}
return false;
}
}
Java
복사
여러 필드 값이 있을 수 있지만, 만약 개발자가 이름과 나이가 같다면 동등한 것이라고 정의하였다면 그것이 곧 동등성입니다.
참고로 String의 equals는 다음과 같이 구현되었습니다.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Java
복사
2. 예상 질문
"동등성과 동일성의 차이는 무엇인가요?"
두 객체가 할당된 메모리 주소가 같으면 동일하며, 두 객체의 내용이 같으면 동등합니다. 동일성은 == 연산자를 통해 판별할 수 있고, 동등성은 equals 연산자를 통해 판별할 수 있습니다.
"== 연산자와 equals 연산자의 차이는 무엇인가요?"
== 연산자는 객체의 동일성을 판별하기 위해 사용하며, equals 연산자는 두 객체의 동등성을 판별하기 위해 사용합니다.
equals 연산자는 재정의하지 않으면 내부적으로 == 연산자와 같은 로직을 수행하므로 차이가 없습니다. 따라서 equals 연산자는 각 객체의 특성에 맞게 재정의를 해야 동등성의 기능을 수행합니다.