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

그런데 실제 프로그래밍에서 서로 다른 개체이지만 String 개체의 값인 문자 집합체가 같은지 비교하고 싶을 때가 많습니다. 이 때는 equals 메서드를 이용하면 서로 다른 개체여도 값인 문자 집합체가 같은지 여부를 확인할 수 있습니다.

 

다음 예제는 == 연산과 equals 메서드로 문자열을 비교하는 예제입니다.

실행 결과

 

특히 문자열을 비교할 때 개발자가 실수하는 것은 문자열 개체를 참조하는 변수와 이중 콤마로 표현한 문자열을 비교하는 것입니다. 먼저 다음의 코드에서 문자열 개체가 몇 개인지 생각해 보십시오.

위 코드에서 문자열 개체는 두 개입니다. s1=“Hello”로 초기화할 때는 내부에서 문자 집합이 “Hello”인 문자열 개체를 만들어서 s1 변수에 대입한 것입니다. 그리고 s2=”Hello”에서는 이미 만들어진 “Hello”인 문자열 개체를 s2에 대입한 것입니다. 따라서 s1==s2의 결과는 참입니다. 하지만 s3 = new String(“Hello”)는 문자 집합이 “Hello”인 문자열 개체를 새롭게 생성하여 s3 변수에 대입한 것입니다. 따라서 s1==s3는 내부에 문자 집합체의 내용은 같지만 서로 다른 개체여서 결과는 거짓입니다.

 

다음은 이를 확인하는 코드입니다.

실행 결과

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