자바의 최상위 클래스인 Object 클래스에는 여러가지 native 메서드가 존재하는데
그 중 equals()에 대해 알아보고자 한다.
1. equals() 란?
Object 클래스에서는 단순히 "동일한" 객체인지 비교. (동일성)
public boolean equals(Object obj) {
return (this == obj);
}
equals() 는 보통 하위 클래스에서 재정의하여 사용하는데, 보통 "동등성"을 비교.
대표적인 예시로, String 클래스의 equals() 들 수 있다.
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;
}
2. == 연산자와의 차이점
"==" 연산자는 primitive type에 대해서는 값을 비교, reference type에 대해서는 주소값을 비교한다.
사실 primitive type에서도 Constant Pool에 있는 특정 상수값을 참조하는 것이기 때문에, 결국 주소값을
비교하는 연산자라고 볼 수 있다.
Object의 equals()와 동일한 기능을 하고 있다고 볼 수 도 있다.
다만 == 연산자의 경우 재정의하여 사용하지 않고, 오직 동일성 비교를 위해서 사용된다고 보면된다.
다음 예제로 == 연산자와 String 클래스의 equals() 메서드를 비교해보자.
public class Main {
public static void main(String[] args) {
String str1 = "apple";
String str2 = new String("apple");
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false
}
}
내부 값 자체를 비교하도록 재정의 되어있는 String 클래스의 equals() 같은 경우,
리터럴 방식으로 선언된 str1과 new로 선언된 str2의 주소값이 다르더라도, 같은 문자열이기 때문에 true가 반환된다.
== 연산자의 경우, str1과 str2의 주소값 자체를 비교하므로 false를 반환하게 된다.
'개발 > Java' 카테고리의 다른 글
String, StringBuilder, StringBuffer (0) | 2022.12.13 |
---|---|
[Java] Garbage Collection(가비지 컬렉션) (2) | 2022.12.02 |
[자바/JAVA] 정적 변수와 메서드 (static) (0) | 2021.06.25 |
[자바/JAVA] this (0) | 2021.06.24 |
[자바/JAVA] 생성자와 초기화 (0) | 2021.06.23 |