[Java] 문자열 비교(==, equals 차이)

2021. 3. 1. 11:40Java

 

Java에서 값 비교를 할 때 일반적으로 == 연산자를 사용합니다.

그러나 문자열은 String 클래스이기 때문에 Primitivie Type(int, char 등)이 아닌 Reference Type이기 때문에 ==로 비교하게 되면 값 비교가 아닌 주소값 비교가 됩니다.

따라서, String에서 문자열 값을 비교하고 싶으면 equals 함수를 사용해야 합니다.

 

이 2가지 차이점을 알아보도록 하겠습니다.

특히, ==연산자 주소값 비교가 어떤 방식으로 하는지 보여드리겠습니다.

1. == 연산자 비교 : 주소값 비교
2. equals 함수 비교 : 문자열 값 비교

 

 

소스

str1 변수는 문자열로 값을 설정하였습니다.

str2 변수는 String 클래스로 new하였습니다.

str3 변수는 StringBuffer와 같이 다른 클래스를 사용하여 문자열을 생성하고 toString 함수로 문자열을 받았습니다.

String str1 = "abc";
String str2 = new String("abc");
String str3 = new StringBuffer().append("abc").toString();

System.out.println("str1 = " + str1);
System.out.println("str2 = " + str2);
System.out.println("str3 = " + str3);

if (str1 == str2) System.out.println("str1 == str2");
else System.out.println("str1 <> str2");

if (str1 == str3) System.out.println("str1 == str3");
else System.out.println("str1 <> str3");

if (str1.equals(str2)) System.out.println("str1, str2은 같습니다.");
else System.out.println("str1, str2은 다릅니다.");

if (str1.equals(str3)) System.out.println("str1, str3은 같습니다.");
else System.out.println("str1, str3은 다릅니다.");

 

 

출력

문자열 값을 출력해보면 육안상으로 보기엔 값이 동일해보입니다.

== 연산자로 비교하면 모두 다르다고 나옵니다.

equals 함수로 비교하면 문자열 값으로 비교하기 때문에 같다고 나옵니다.

// 문자열 값 출력
str1 = abc
str2 = abc
str3 = abc

// == 비교
str1 <> str2
str1 <> str3

// equals 함수 비교
str1, str2은 같습니다.
str1, str3은 같습니다.

 

 

== 연산자 주소 비교

== 연산자로 비교했을 때 값이 다른 이유는 디버깅을 해보면 알 수 있습니다.

우측 Variables 탭에서 str1, str2, str3의 id를 보시면 22, 29, 30으로 모두 다릅니다.

C에서 메모리 주소가 표시된다고 하면 자바에서는 id값으로 주소를 표현하고 있습니다.

저 id가 같으면 동일한 reference를 가지므로 == 연산자로 비교하면 같지만 

지금과 같이 new를 하거나 다른 클래스에서 toString으로 문자열을 생성한 경우는 id가 모두 다릅니다.

반응형