2024.04.04 - [Baekjoon(JAVA)/Algorithm] - [Baekjoon(JAVA) - Algorithm] 10988번: 팰린드롬인지 확인하기
위의 문제를 풀다 보니 String 클래스의 equals()와 contentEquals() 메서드의 차이를 알아야 할 것 같아서 정리하고자 한다.
equals() vs contentEquals()
Java에서 String 클래스의 equals()와 contentEquals() 메서드는 문자열 비교를 수행하는 데 사용된다.
우선 공통점은 두 메서드 모두 String 클래스의 public 메서드라는 것이다.
또한 해당 String 인스턴스의 문자열 값과 입력 매개변수의 문자열을 비교하여 두 문자열이 정확히 같으면 true, 다르면 false를 반환하는 메서드이다.
그러나 이 두 가지 방법의 기능은 차이가 있다.
equals()
String 클래스도 기본적으로 Obejct 클래스를 상속받고 있으며, Object 클래스의 `equals()` 메서드를 재정의(Override)한 메서드이다.
public boolean equals(Object anObject)
따라서 입력 매개변수의 문자열과 같은지 비교할 뿐만 아니라 매개변수가 같은 String 인스턴스인지도 확인하다.
즉, String과 String 객체 사이의 비교만 가능하다.
만약 String과 StringBuilder 객체를 `equals()` 메서드를 이용해서 비교하려면 `toString()` 메서드를 사용하면 된다.
String fruit = "apple";
StringBuilder fruit2 = new StringBuilder("apple");
System.out.println(fruit.equals(fruit2.toString())); // true
하지만 `toString()` 메서드를 사용하는 것은 `contentEquals()` 메서드에 비해 비교적 오버헤드가 있기 때문에 String과 StringBuilder 객체를 비교할 때 `equals()` 메서드는 효율적이지 않다.
contentEquals()
Object 클래스에는 없는 String 클래스에서 새롭게 만든 메서드이다.
입력 매개변수의 문자열과 같은지 비교하기는 하지만 꼭 String 인스턴스일 필요는 없다.
즉, String 객체와 CharSequence 인터페이스를 구현한 객체를 비교할 수 있다.
public boolean contentEquals(CharSequence cs)
CharSequence를 구현한 객체는 String, StringBuffer, StringBuilder, CharBuffer 등이 있다.
따라서 String과 String 간에 문자열 비교 외에 String과 StringBuilder 간에 문자열 비교도 할 수 있다.
String fruit = "apple";
StringBuilder fruit2 = new StringBuilder("apple");
System.out.println(fruit.contentEquals(fruit2)); // true
`equals()` 메서드와는 다르게 CharSequence를 이용해 직접 비교를 하기 때문에 String과 StringBuilder 간에 비교를 할 때 효율적이다.
Conclusion
`equals()`와 `contentEquals()` 메서드 모두 문자열이 같은지 비교할 수 있지만,
`equals()` 메서드는 두 비교 대상이 모두 String 객체인지도 확인하는 반면, `contentEquals()` 메서드는 객체의 내용만 확인한다.
따라서 String 객체끼리의 비교에는 `equals()`, String과 다른 객체 간에 비교에는 `contentEquals()`를 사용하면 좋을 것 같다.
References
https://www.baeldung.com/java-string-equals-vs-contentequals