그런데 실제 프로그래밍에서 서로 다른 개체이지만 String 개체의 값인 문자 집합체가 같은지 비교하고 싶을 때가 많습니다. 이 때는 equals 메서드를 이용하면 서로 다른 개체여도 값인 문자 집합체가 같은지 여부를 확인할 수 있습니다.
다음 예제는 == 연산과 equals 메서드로 문자열을 비교하는 예제입니다.
//String 형식을 비교 연산자와 equals 메서드로 비교 예 public class Program { public static void main(String[] args){ String str1 = new String("1"); String str2 = new String("1"); String str3 = str1; System.out.print("str1==str2:"); System.out.println(str1==str2); System.out.print("str1==str3:"); System.out.println(str1==str3); System.out.print("str1.equals(str2):"); System.out.println(str1.equals(str2)); System.out.print("str1.equals(str3)"); System.out.println(str1.equals(str3)); } }
실행 결과
str1==str2:false str1==str3:true str1.equals(str2):true str1.equals(str3)true
특히 문자열을 비교할 때 개발자가 실수하는 것은 문자열 개체를 참조하는 변수와 이중 콤마로 표현한 문자열을 비교하는 것입니다. 먼저 다음의 코드에서 문자열 개체가 몇 개인지 생각해 보십시오.
String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello");
위 코드에서 문자열 개체는 두 개입니다. s1=“Hello”로 초기화할 때는 내부에서 문자 집합이 “Hello”인 문자열 개체를 만들어서 s1 변수에 대입한 것입니다. 그리고 s2=”Hello”에서는 이미 만들어진 “Hello”인 문자열 개체를 s2에 대입한 것입니다. 따라서 s1==s2의 결과는 참입니다. 하지만 s3 = new String(“Hello”)는 문자 집합이 “Hello”인 문자열 개체를 새롭게 생성하여 s3 변수에 대입한 것입니다. 따라서 s1==s3는 내부에 문자 집합체의 내용은 같지만 서로 다른 개체여서 결과는 거짓입니다.
다음은 이를 확인하는 코드입니다.
//문자열 비교에서 자주하는 실수 public class Program { public static void main(String[] args){ String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); System.out.print("s1==s2:"); System.out.println(s1==s2); System.out.print("s1==s3:"); System.out.println(s1==s3); } }
실행 결과
s1==s2:true s1==s3:false
따라서 문자열을 비교할 때 변수==”문자열” 과 같은 형태로 비교하는 것은 논리적 버그가 있는 코드라고 볼 수 있습니다.