[Java] 6.2.3 String 클래스의 비교에서 자주하는 실수

그런데 실제 프로그래밍에서 서로 다른 개체이지만 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

따라서 문자열을 비교할 때 변수==”문자열” 과 같은 형태로 비교하는 것은 논리적 버그가 있는 코드라고 볼 수 있습니다.