성장일기

 자바에서 문자열을 비교할 때 ==, 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가 참조하는 주소의 값은 다르지만 값이 같으므로 "값이 같음"이 출력 될 것이다.

공유하기

facebook twitter kakaoTalk kakaostory naver band