자바 문자열 비교 ==, equals 차이점
자바에서 문자열을 비교하는 방법입니다.
자바에서 문자열을 비교할 때 equals() 와 == 을 많이 사용합니다.
이 두가지의 차이점은 무엇일까요 ?
1. ==
== 의 경우 주소의 값을 비교합니다. (Call By Reference)
2. equals
equals 는 비교하고자 하는 두개의 객체의 값을 비교합니다. (Call By value)
따라서 == , equals 는 비교주체가 다릅니다.
그런데 String 은 클래스 입니다.
그렇기 때문에 기본적으로 생성할 때 주소값이 부여되고 두개의 String을 선언해서
같은 값을 넣었다 해도 이 두개의 String 은 주소값이 다릅니다.
1. ==
String a = "TEST";
String b = "TEST";
if(a == b) {
System.out.println("두개의 값이 같음.");
}else {
System.out.println("두개의 값이 다름.");
}
이때의 결과는 두개의 값이 같음. 이 나오게 됩니다.
왜일까요?
String을 new로 생성하지 않고 "" 리터럴을 사용하여 생성할경우
생성한 String을 Constant pool에 할당하고, b 는 새로 생성하는 것이 아니라
a가 가리키는 TEST 를 바라보게 됩니다.
그렇기 때문에 a와 b 는 동일한 주소값을 가지게 되는거죠.
하지만 이 경우는 다릅니다.
String a = "TEST";
String b = new String("TEST");
if(a == b) {
System.out.println("두개의 값이 같음.");
}else {
System.out.println("두개의 값이 다름.");
}
System.out.println("a의 hashCode: " + Integer.toHexString(System.identityHashCode(a)));
System.out.println("b의 hashCode: " + Integer.toHexString(System.identityHashCode(b)));
a는 Constant pool 즉 상수풀 안에 생성됩니다.
b는 jvm 내부의 heap 메모리 영역에 생성이 됩니다.
따라서 값은 동일해도 데이터의 주소를 다릅니다.
a의 hashCode: 15db9742
b의 hashCode: 6d06d69c
따라서 equals 를 사용해야 합니다.
2. equals()
String a = "TEST";
String b = new String("TEST");
if(a.equals(b)) {
System.out.println("두개의 값이 같음.");
}else {
System.out.println("두개의 값이다름.");
}
equals() 메소드는 주소 값이 아닌 값을 비교하기 때문에
정확히 값을 비교할 수 있습니다.