물멍~~하는 인생

[Java] - String 문자열 비교 본문

Java

[Java] - String 문자열 비교

Wardoc 2020. 5. 21. 12:16

String 생성에는 두가지 방법이 있다.

1) 리터럴 방식

2) new String 방식


1
2
    String a = "abc";  //리터럴 방식
    String b = new String("abc");  //new String 방식
cs



두가지 방식은 저장되는 메모리 공간이 틀리다.

리터럴 방식은 String constant pool에 new String 방식은 객체이므로 heap에 저장된다.

그렇기 때문에 값은 같아도 참조 값이 틀려지고 이는 문자열 '==' 비교시에 비교값이 달라지는 역할을 하게 된다.


어떻게 참조가 이루어 지는지 보자

아래와 같이 변수 선언을 했다고 하자

1
2
3
    String a = "abc";
    String a1 = "abc";
    String b = new String("abc"); 
cs

그러면, 리터럴방식으로 생성한 변수a의 값은 'string constant pool'에 동일한 값이 있는지 한번 

스캔을 거치고 없으면 생성한다.

변수a1도 동일한 방식을 진행하고 'pool'에 같은 값이 있으므로 그 값을 참조한다.

변수b는 새로운 객체를 생성했으므로 'heap' 메모리에 값이 저장된다.


[대충 이런 구조]




이제, String 문자열 비교를 알아보자. 방법에는 크게 세가지가 있다.

1) '==' 매칭 연산자

2) equals 메소드 

3) compareTo 메소드 



1) '==' 매칭 연산자

두번째 세번째방식과 가장 큰 차이는 '=='연산자는 값이 아닌 참조값을 비교한다는 것이다.

즉, 아무리 값이 같아도 new String으로 생성한 변수는 같은 값으로 인지하지 않는다.


1
2
3
4
5
6
    String a = "abc";
    String a1 = "abc";
    String b = new String("abc"); 
    
    System.out.println(a==a1);  //true
    System.out.println(a==b);   //false
cs



2) equals 메소드
값을 비교하는 메소드로, String 비교할때 제일 많이 쓰이는 메소드이다.
어떤 방식으로 생성하였든 값만 같으면 true를 반환한다.

1
2
3
4
5
6
    String a = "abc";
    String a1 = "abc";
    String b = new String("abc"); 
    
    System.out.println(a.equals(a1));  //true
    System.out.println(a.equals(b));   //true
cs


참고로, equals는 대소문자를 구분하므로 대소문자 구분없이 값을 비교하고 싶다면
equalsIgnoreCase를 사용하면 된다.

1
2
3
4
    String a = "abc";
    String a1 = "ABC";
 
    System.out.println(a.equalsIgnoreCase(a1));  //true
cs


3)compareTo 메소드

비교의 결과를 true / false 가 아닌 정수의 값으로 반환한다. 

일치하면 0 , 그외에는 다른 값을 반환한다.( 반환하는 방식은 다루지 않겠다.)


1
2
3
4
5
6
    String a = "abc";
    String a1 = "ABC";
    String b = new String("abc"); 
    
    System.out.println(a.compareTo(a1));  //32
    System.out.println(a.compareTo(b));   //0
cs