Java
[Java] - String 문자열 비교
derlung
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 |