[Java] replace() vs replaceAll()

🌈 m1naworld ·2022년 11월 22일
0

자바를 잡아! 👻

목록 보기
19/19
post-thumbnail

자바 스트링 관련 함수 중 특정 문자열을 원하는 문자열로 치환하는 함수

  • replace()
String replace(CharSequence target, CharSequence replacement);
  • replaceAll()
String replaceAll(String regex, String replacement);

+) replaceFirst()
처음 발견한 문자만 치환하고 싶은 경우

String replaceFirst(char oldFirstChar, char newFirstChar);

예제 1

String str1 ="aaaa";

System.out.println(str1.replace("aa", "b"));  //bb
System.out.println(str1.replaceAll("aa", "b"));  //bb

위의 예제만 보면 두 함수의 차이점은 없어 보이지만,두 함수의 가장 큰 차이점은 입력 인자 값의 형에 있다. replace()는 CharSequence 이고 replaceAll()는 String이라는 것, 이때 String이라는 것은 regular expression 즉, 정규 표현식이라고 부르는 형식의 인자값을 사용할 수 있다.


예제 2

String str2 = "abcdefghijk";

System.out.println(str2.replaceAll("[abchij]", "z")); //zzzdefgzzzk
System.out.println(str2.replace("a", "z").replace("b", "z").replace("c", "z").replace("h", "z").replace("i", "z").replace("j", "z")); //zzzdefgzzzk


// 정규표현식을 활용해 원하는 문자열을 제외하고 치환
System.out.println(str2.replaceAll("[^abchij]", z)) // abczzzzhilz

위처럼 여러 문자를 한번에 치환하기 원하는 경우, replace() 함수를 통해 작업을 할 순 있지만 번거롭다. 이러한 경우 replaceAll() 함수와 정규표현식을 활용하면 쉽게 구현할 수 있다. 추가적으로 실제 대상 문자열이 어떤 형태인지 모를 경우 replace() 함수만을 사용하하여 문자열 치환을 구현하기 어렵다. 이러한 불특정 입력값을 변환하고자 할 경우 replaceAll()을 활용한다.


그렇다면, replaceAll()이 replace()보다 더욱 큰 범위의 함수같은데 이것만 사용하면 되지 않나?

하는 의문이 생길 수 있다.

그러나 오히려 예제 1번과 같이 단순한 경우 replaceAll()을 사용할 경우 replace()보다 연산 속도가 느리다[알고리즘 결과 참고]. 또한 정규표현식을 사용하지 않고 간단한 구문을 구현하고 싶은 경우 사용하면 좋다.

String str3 ="aa..bbcc";

System.out.println(str.replace(".", "dd")); // aaddddbbcc
System.out.println(str.replaceAll(".", "dd")); // dddddddddddddddd

위의 결과의 차이는 replaceAll()에서 "."을 정규표현식으로 인지하여 모든 문자열을 가리켜 모든 문자열이 바뀐걸 확인할 수 있다. 위 처럼 두 함수의 차이를 모르고 사용할 경우 원치 않는 결과를 얻을 수 있다!

String str4 ="010-01@@-@@@@"; 

// 두 문자를 하나의 문자로 치환하고자 하는 경우
System.out.println(str.replace("-", "*").replace("@", "*")); // 010*01*******
System.out.println(str.replaceAll("[-@]", "*")); // 010*01*******

// 두 문자를 각 각의 다른 문자로 치환하고자 하는 경우
System.out.println(str.replace("-", "*").replace("@", "0")); // 010*0100*0000
System.out.println(str.replaceAll("[-]", "*").replaceAll("[@]" , "0")); // 010*0100*0000
System.out.println(str.replaceAll("-", "*").replaceAll("@" , "0")); // 010*0100*0000

replaceAll()은 정규표현식을 사용하기 때문에 특수문자는 치환이 안된다는 블로그들이 있었다. 그러나 직접 해본 결과 잘 변하는 것을 확인할 수 있다. 또한 위의 예제를 통해 -@를 모두 한번에 같은 문자열로 치환할 경우 replaceAll()이 간단하지만, -@ 각각 치환하고자 하는 문자가 다를 경우 replace()를 사용하는게 간단하고 좋은 것 같다.

두 함수의 차이를 알고 상황에 맞게 용도에 맞게 더욱 적합한 것을 사용하자! 🌟



Ref.
jamesdreaming
ReA's 기술블로그

profile
개발자로 사는 내 삶은 즐거워 👾

0개의 댓글