자바에서 문자열을 비교할 때 ==, equals()를 많이 사용한다.
이 두가지의 차이점은 무엇일까?
1. ==
이 경우에는 주소의 값을 비교한다. (Call By Reference방식)
String a = "Hello";
String b = "Hello";
if(a == b){
System.out.prinln("값이 같음");
}else{
System.out.println("값이 다름");
}
이때의 결과는 값이 같음이 출력된다.
java에서 문자열은 new연산자로 생성하지 않고, ""리터럴로 생성할 경우 같은 문자열이면 동일한 주소를 가지게 된다. 결국 a와 b가 값은 주소값을 가지게 된다.
따라서 ==는 주소의 값을 비교하기 때문에 "값이 같음"이 출력된다.
하지만 다음의 경우에는 다르다.
String a = "Hello";
String b = new String("Hello");
if(a == b){
System.out.prinln("값이 같음");
}else{
System.out.println("값이 다름");
}
문자열을 new 연산자로 생성할 경우 같은 문자열이여도 a와 b는 각각 다른 주소를 참조하게 된다. 따라서 주소의 값을 비교하는 a == b의 결과는 "값이 다름"이 출력 된다.
+ a는 Constant Pool 즉 상수풀 안에 생성되고, b는 jvm 내부의 heap 메모리 영역에 생성된다.
따라서 위 경우에 Hello라는 두 문자열의 "값이 같음"을 출력하는 것이 목적이라면 다음의 방법을 사용해야 한다.
2. equals()
이 경우에는 주소 값이 아닌 객체의 값을 비교한다. (Call By Value 방식)
String a = "Hello";
String b = new String("Hello");
if(a.equals(b)){
System.out.prinln("값이 같음");
}else{
System.out.println("값이 다름");
}
이 경우는 두 객체의 값을 비교하기 때문에 a, b가 참조하는 주소의 값은 다르지만 값이 같으므로 "값이 같음"이 출력 될 것이다.