String equals란?
Java의 String 클래스에서 equals 메서드는 두 문자열이 같은지 비교하는 데 사용됩니다.
== 연산자와 equals 메서드 비교
== 연산자
== 연산자는 두 객체의 참조(메모리 주소)를 비교합니다.
따라서, 같은 문자열 리터럴을 참조하는 경우에는 true를 반환하지만, new 키워드를 사용해 생성된 문자열 객체는 서로 다른 메모리 주소를 가지므로 false를 반환합니다.
String s1 = "123";
String s2 = "123";
String s3 = new String("123");
System.out.println("s1 == s2 : " + (s1 == s2)); //같은 주소를 바라보기때문에 true
System.out.println("s1 == s3 : " + (s2 == s3)); //false
위와 같이 "123"과 new String("123")은 같지 않다고 나옵니다.
이러한 이유 때문에 문자열을 비교할 때는 equals메서드를 사용합니다.
equals 메서드
equals 메서드는 문자열의 실제 내용을 비교합니다. 따라서 문자열의 내용이 같다면 true를 반환합니다.
System.out.println("s1.equals(s3) : " + s1.equals(s3)); //true
equals를 통해 큰따옴표로 생성한 "123"과 new로 생성한 "123"의 값이 같음을 볼 수 있습니다.
equals메서드뿐만 아니라 equalsIgnoreCase와 contentsEquals도 존재합니다.
equalsIgnoreCase
equalsIgnoreCase 메서드는 대소문자를 구분하지 않고 문자열의 내용을 비교합니다.
대소문자 차이만 있는 경우에도 true를 반환합니다.
String s1 = "abc";
String s2 = "ABC";
System.out.println("equalsIgnoreCase : " + s1.equalsIgnoreCase(s2));
System.out.println("equals : " + s1.equals(s2));
//result
//equalsIgnoreCase : true
//equals : false
"abc"와 "ABC"는 다르지만 대소문자만 바꿔주면 같은 형태가 됩니다.
두 문자열을 대소문자 상관없이 비교해야 할 때 따로 맞춰줄 필요 없이 사용하기에 좋습니다.
CharSequence 및 StringBuffer 비교 contentsEquals
contentEquals 메서드는 String과 CharSequence (또는 그 하위 클래스인 StringBuffer, StringBuilder)의 내용을 비교할 때 사용됩니다.
StringBuffer sb = new StringBuffer("abc");
System.out.println("s1.contentEquals(sb) : " + s1.contentEquals(sb));
CharSequence cs = new StringBuffer("abc");
System.out.println("s1.contentEquals(cs) : " + s1.contentEquals(cs));
CharSequence cs2 = new StringBuilder("abc");
System.out.println("s1.contentEquals(cs2) : " + s1.contentEquals(cs2));
CharSequence는 인터페이스라서 CharSequce를 사용하면 StringBuffer뿐만 아니라 StringBuilder도 매개변수로 넣어서 사용할수 있습니다.
문자열 비교 시 주의점
문자열을 비교할 때 == 연산자를 사용하면 의도치 않은 결과가 발생할 수 있으므로, 문자열의 내용을 비교할 때는 항상 equals나 equalsIgnoreCase 메서드를 사용하는 것이 좋습니다.
참조형 변수와 기본형 변수의 차이
문자열은 참조형 변수(reference type)로, == 연산자를 사용하면 객체의 메모리 주소를 비교합니다.
반면, 기본형 변수(primitive type)는 값을 직접 비교합니다.
문자열 상수 풀
Java는 문자열 상수 풀(string constant pool)을 사용하여 같은 문자열 리터럴을 공유합니다.
따라서, 같은 리터럴을 가진 문자열은 같은 메모리 주소를 참조합니다.
불변성(Immutability)과 성능
Java의 String 클래스는 불변(immutable) 객체로 설계되어 있습니다.
문자열을 변경할 경우 새로운 문자열 객체가 생성됩니다. 이는 문자열 비교에서 equals 메서드가 안정적으로 동작하는 이유 중 하나입니다.