자바 문자열 비교 ==, 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() 메소드는 주소 값이 아닌 값을 비교하기 때문에 

정확히 값을 비교할 수 있습니다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기