Java에서 ==와 equals는 자신의 기준으로 양쪽을 비교하여 boolean의 형태로 결과를 나태내는 역할을 한다는 공통점이 있습니다. 하지만 ==와 equals는 분명한 차이점이 존재합니다. 일단 가장 간단하게 ==는 비교 연산자이고 equals는 메서드입니다. 하지만 가장 중요한 차이점은 동일성과 동등성이라고 볼 수 있습니다.
동일성
동일성은 지금 비교하고 있는 값들이 동일하다는 의미입니다. Java는 실제 값을 저장하는 원시 타입(Primitive Type)과 참조 값을 저장하는 참조 타입(Reference Type)이 있습니다. 이때 원시 타입의 경우는 단순히 값을 비교하여 동일성의 여부를 나타내지만 참조형의 경우 참조 값. 즉, 객체의 주소를 기준으로 동일성을 판단하게 됩니다. ( 하지만 String과 같이 특별한 타입이 존재하긴 합니다. ) Java에서 이러한 동일성의 비교를 == 연산자를 통해 비교하고 있습니다.
public static void main(String[] args) {
int intA = 1;
int intB = 1;
System.out.println(intA == intB);
String strA = "a";
String strB = "a";
System.out.println(strA == strB);
String stringA = new String("a");
String stringB = new String("a");
System.out.println(stringA == stringB);
}
//result
true
true
false
위 예제에서 String으로 생성된 변수들을 new 키워드로 생성한 경우 값은 동일하지만 참조 값이 서로 다르기 때문에 동일성에서는 false를 나타내고 있습니다. 하지만 리터럴로 생성한 경우 Heap 영역 String Pool에 "a"가 생성되고 "a"를 호출하는 경우 String Pool에 존재하는 "a"의 참조값을 반환하기 때문에 동일성 비교에서 true가 출력되는 것을 알 수 있습니다.
동등성
두 오브젝트가 같은 정보를 가지고 있는 경우를 의미합니다. 같은 참조 값을 가지지 않더라도 같은 값을 가지고 있는 경우를 찾을 때 사용하게 됩니다. Java에서는 이러한 동등성의 비교를 equals 메서드를 통해 비교하고 있습니다.
public static void main(String[] args) {
String strA = "a";
String strB = "a";
System.out.println(strA.equals(strB));
String stringA = new String("a");
String stringB = new String("a");
System.out.println(stringA.equals(stringB));
}
//result
true
true
설명했던 것과 같이 동일성 비교에서 같은 참조 값이 아니라 false가 출력 되었던 stringA와 stringB가 equals를 통해 true를 반환하게 되었습니다. 아래에서 String의 equals 메서드를 보면 true를 반환하는 조건이 같은 오브젝트이거나 String Type의 오브젝트이면서 길이와 각각 위치의 Character가 일치하는지 여부를 통해 동등성을 결과를 반환하게 됩니다.
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;
}
'Language > Java' 카테고리의 다른 글
[Java] String과 String Pool (0) | 2021.11.01 |
---|---|
[Java] String의 불변성( Immutable ) (0) | 2021.11.01 |
[Java] orElse vs orElseGet (0) | 2021.10.29 |
[Java] Optional (0) | 2021.10.29 |
[Java] 연산자 ( Operator ) (0) | 2021.10.23 |
댓글