자바 문제를 풀 때, 문자값을 변경할 때 사용하는 대표적인 메서드가
바로 replace와 replaceAll이다.
주의깊게 생각하지 않고 값 변경 시 replace, replaceAll 모두 사용하다가,
둘 다 사용 시 결과값이 비슷하여 문득 차이가 무엇인지 궁금해졌다.
replace()와 replaceAll() 사용법
둘 다 원하는 문자값을 다른 문자값으로 대체하는 기능을 한다.
메서드 사용법은 아래와 같다.
- String.replace(CharSequence target, CharSequence replacement)
- String.replaceAll(String regex, String replacement)
해당 문자열에서 바꾸고자 하는 문자나 문자열과 일치하는 모든 부분을 수정해준다.
<예시>
String str = "apple banana apple orange apple";
// replace 메서드 사용
String replacedStr = str.replace("apple", "grape");
System.out.println("replace 사용: " + replacedStr); // 출력: grape banana grape orange grape
// replaceAll 메서드 사용
String replacedAllStr = str.replaceAll("apple", "grape");
System.out.println("replaceAll 사용: " + replacedAllStr); // 출력: grape banana grape orange grape
replace, replaceAll 차이점
두 메서드 모두 특정 문자열 모두를 원하는 문자열로 변경한다.
그러나 입력하는 입력값의 형태가 엄연히 다르다.
replace에서는 단순 문자 혹은 문자 모음을 입력하며,
replaceAll에서는 String regex, 즉 정규표현식을 활용하여 활용 범위가 더 넓다고 할 수 있다.
예를 들어, 문자열의 여러 문자를 한 번에 하나의 문자로 대체하고자 하는 경우,
replace 메서드를 사용하면 상당히 번거로운데,
이 때 replaceAll 메서드로 정규표현식을 활용하여 쉽게 처리할 수 있다.
<예시>
public class ReplaceExample {
public static void main(String[] args) {
String originalString = "Hello! How are you? 123.";
// 정규 표현식을 사용하여 모든 비알파벳 문자를 제거하는 replaceAll 사용
String cleanedString = originalString.replaceAll("[^a-zA-Z0-9]", "");
System.out.println(originalString); //출력: Hello! How are you? 123.
System.out.println(cleanedString); //출력: HelloHowareyou123
}
}
- 정규 표현식 [^a-zA-Z0-9]은 소문자 (a-z), 대문자 (A-Z), 숫자 (0-9)가 아닌 문자를 모두 일치시킴
(^는 문자 클래스 안에서 부정(not)을 의미).
그렇다고 무조건 replace 메서드 대신 replaceAll 메서드만 사용하는 것은 좋지 않다.
replaceAll 메서드의 경우 구현 과정에서 인스턴스를 생성하여
replace 메서드에 비해 성능이 떨어질 수 있기 때문이다.