본문 바로가기
JAVA(프로그래밍)

java replace 와 replaceAll 차이점에 대해 자세히 알아보자

by 켈리113 2018. 7. 21.

안녕하세요. 자바에는 문자열을 변환할수 있는 메소드들이 있습니다.

메소드명을 보시면 대충 감이 오실텐데요. 오늘은 replace, replaceAll 두가지 메소드에 대해 자세히 알아보겠습니다.

 

먼저 사용법을 설명하겠습니다.

replace는 말 그대로 특정 문자열을 원하는 문자열로 치환하는 메소드입니다.

 

예제를 통해서 알아보겠습니다.

 

 String str = "aaa1";
  
  String result = str.replace("1", "");
  
  System.out.println("result->"+ result);

 

이렇게 했을때 결과값이 어떤값이 나올까요?

왼쪽 인자값이 찾을문자열 , 오른쪽이 변환될 문자열 입니다.

결국 저 예제문은 str에 있는 문자열 aaa1 중 1을 찾아서 "" 공백으로 변환합니다.

 

 

이클립스에서 실행시켜보면 결과값 aaa 가 출력되는걸 확인하실수 있습니다.

 

그럼 replaceAll을 메소드를 사용하면 어떨까요?

  String str = "aaa1";
  
  String result = str.replaceAll("1", "");
  
  System.out.println("result->"+ result);

 

결과값은 replace사용했을때와 마찬가지입니다.

얼핏 생각해보면 두 메소드는 차이가 없어 보입니다.

하지만 분명한 차이점이 있답니다.

 

String replace(CharSequnce target, CharSequence replacement)

String replaceAll(String regex, String replacement)

 

말 그대로 replace는 첫번째 인자값을 보시면 문자열이 들어갑니다. 문자열만 변환가능한데 반해서

replaceAll은 첫번째 인자값에 정규식이 들어갑니다. 정규식에 대해 잘 모르시는 분도 계시겠지만 이부분은 나중에 더 자세히 알아보겠습니다. 정규식을 이용하면 불특정 문자열을 변환할수 있는 장점이 있습니다.

한번 예제를 통해서 알아보겠습니다.

 

  String str = "aaabbbccccabcddddabcdeeee";
  
  String result1 = str.replace("abc", "왕");
  String result2 = str.replaceAll("[abc]", "왕");
  
  System.out.println("replace result->"+ result1);
  System.out.println("replaceAll result->"+ result2);

 

결과값

replace result->aaabbbcccc왕dddd왕deeee
replaceAll result->왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee

결과값을 보시면 replaceAll에는 정규식을 사용할수가 있어서 replace에서 처리하지 못한 문자열도 처리가 가능합니다.

[abc]  정규식 표현입니다. [abc]는 []안에 있는 문자들을 전부 왕으로 변환시켜줍니다. a or b or c 3가지의 문자를 만나면 전부 치환대상이 됩니다. 만약 replace를 정규식을 사용하지 않고 원한는 결과값을 얻기 위해서 코딩을 해보겠습니다.

 

  String str = "aaabbbccccabcddddabcdeeee";
  
  String result1 = str.replace("a", "왕").replace("b", "왕").replace("c", "왕");
  String result2 = str.replaceAll("[abc]", "왕");
  
  System.out.println("   replace result->"+ result1);
  System.out.println("replaceAll result->"+ result2);

 

   replace result->왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee
replaceAll result->왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee

 

이렇게 코딩을 하니 결과값이 같아졌습니다. 하지만 저렇게 하려면 상당히 코딩량이 많아지고 비효율적이겠죠. 더군다난 검색할 문자가 더 많아진다면...결국은 replace로는 불가능한 방법입니다.

 

replaceAll을 이용하여 정규식을 사용하면 정말 많은걸 할수가 있습니다.

 

  String str = "testa1testbccc2testccc3";
  str = str.replaceAll("[^0-9]", "");
  
  System.out.println(str);

해당 정규식을 간단히 알아보겠습니다. 해당 정슈식은 숫자를 찾아주는 정규식입니다.

숫자가 아닌 값은 전부 빈문자열로 치환하라는 의미입니다.

 

결과값은 123
출력됩니다.

숫자만 찾고자 할때 유용하게 쓰이겠죠..

 

그럼 약간 변형해서 다시 해보겠습니다.

 

  String str = "testa1testbccc2testccc3";
  str = str.replaceAll("[0-9]", "");
  
  System.out.println(str);

 

해당결과값은

testatestbccctestccc
가 출력됩니다.

 

이번꺼는 숫자는 전부 빈문자열로 치환해서 문자열만 출력되게 됩니다.

여기까지 보시면 ("[^0-9]", "");, ("[0-9]", "");

두가지 차이점을 아실수 있겠죠.. ^는 아니다를 의미합니다 0-9 0부터 9까지의 숫자가 아닌것을 전부 문자열로 치환하라는 의미죠.

 

이런식으로 정규식을 이용한다면 편리하게 원하는 결과값을 찾을수 있습니다.