언어 자료구조 알고리즘/디딤돌 Java 언어 Part1

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

언제나휴일 2016. 11. 17. 01:29
반응형

출간일 2016년 11월 28일

판매가 2000원

형태 ebook


이 책의 모든 내용은 http://ehpub.co.kr에 공개하고 있습니다.

학습에 도움이 되시면 ebook을 구입하여 소장하시면 감사하겠습니다.

언제나 휴일 출판사의 수익금의 대부분은 아프리카에 기부하고 있습니다.



 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

[소스 6.5] String 형식을 비교 연산자와 equals 메서드로 비교 예

 

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

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

[소스 6.6] 문자열 비교에서 자주하는 실수

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


[Java] 6.2.2 String 클래스의 비교


반응형