안녕하세요. 제임스 입니다. 


이번에는 자바 String 관련 함수 중 특정 문자열을 원하는 문자열로 치환하는 함수에 대해 알아 보겠습니다. 


■ String replace(CharSequence target, CharSequence replacement)


replace() 함수의 첫번째 인자값은 변환하고자 하는 대상이 되는 문자열입니다. 두번째 인자 값은 변환할 문자 값입니다. 


예제를 보시겠습니다. 

String str1 = "aaaa";

System.out.println("result ===> "+str1.replace("aa", "b"));

앞에서 부터 순차적으로 "aa" 라는 문자값이 있을 경우 "b" 로 치환하기 때문에 결과 값은 아래와 같습니다. 

result ===> bb


다른 예제도 하나더 보겠습니다. 

String str2 = "자바 코딩";

System.out.println("result ===> "+str2.replace("바 코", "good"));

치환하고자 하는 문자열이 "바 코"로 공백문자를 포함한 문자 열입니다. 

이를 "good" 으로 치환하면 결과는 아래와 같습니다. 

result ===> 자good딩



■ String replaceAll(String regex, String replacement)


replace() 함수와 같이 첫번째 인자값은 변환하고자 하는 대상이 되는 문자열이며, 두번째 인자 값은 변환할 문자 값입니다. 


예제를 보시겠습니다. 

String str1 = "aaaa";

System.out.println("result ===> "+str1.replaceAll("aa", "b"));

replace() 의 첫번째 예제와 동일한 문자열을 이용하여 "aa" 라는 문자값을 "b" 로 변환 했습니다. 

결과 값은 아래와 같습니다. 

result ===> bb


두번째 예제도 replace() 의 두번째 문자열과 동일하게 사용해 보겠습니다. 

String str2 = "자바 코딩";

System.out.println("result ===> "+str2.replaceAll("바 코", "good"));

replace 를 replaceAll 로 바꾸기만 했습니다. 

결과는 아래와 같습니다. 

result ===> 자good딩



지금까지 예제들을 보시면 replace() 와 replaceAll() 함수의 차이점이 없어 보입니다. 

정말 차이가 없을까요? 차이점이 없는 동일한 동작을 하는 함수인데 이런 API를 제공할리 없겠죠? 

그럼 지금부터 이 두 함수가 뭐가 다른지 알아 보겠습니다. 


■ replace() vs replaceAll()


두 함수의 가장 큰 차이점은 입력 인자 값의 형이 하나는 CharSequence 이고 다른 하나는 String 이라는 겁니다. 여기서 String 이라는 것은 regular expression 즉, 정규표현식이라고 부르는 형식의 인자값을 사용할 수 있다는 겁니다. 


그럼 예제를 하나 보겠습니다. 

String str3 = "abcdefghijk";

System.out.println("result ===> "+str3.replaceAll("[abchij]", "굿"));

replaceAll 의 첫번째 인자 값으로 입력한 [abchij] 라는 값은 정규표현식 값으로 의미하는 바는 a, b, c, h, i, j 라는 값을 모두 의미 합니다. 

즉, 상기 값들 모두 "굿" 이라는 문자열로 변환하겠다는 의미 입니다. 


결과 값은 어떻게 나올까요? 

result ===> 굿굿굿defg굿굿굿k


비슷한 예제 하나 더 보시겠습니다. 

String str3 = "abcdefghijk";

System.out.println("result ===> "+str3.replaceAll("[^abchij]", "굿"));

동일 문자 열을 대상으로 replaceAll 을 하는데 이번에는 정규표현식에 " ^ " 라는 값이 들어 갔습니다. 

이는 a, b, c, h, i, j 를 제외한 모든 문자를 굿으로 변환 하겠다는 의미 입니다. 


결과 값은 아래와 같습니다. 

result ===> abc굿굿굿굿hij굿



replace 를 사용하여 위 replaceAll 한 결과 값을 가져 오기 위해서는 어떻게 해야 할까요? 

String str3 = "abcdefghijk";

System.out.println("result ===> "+
str3.replace("a", "굿")
.replace("b", "굿")
.replace("c", "굿")
.replace("h", "굿")
.replace("i", "굿")
.replace("j", "굿")
);

위와 같이 치환을 원하는 각각의 문자열을 모두 찾거나 연속적인 입력 값이라면 아래와 같이 하면 됩니다. 

String str3 = "abcdefghijk";

System.out.println("result ===> "+
str3.replace("abc", "굿굿굿")
.replace("hij", "굿굿굿")
);

이렇게 하면 첫번째 예제와 동일한 결과 값을 가져 올수 있습니다. 

result ===> 굿굿굿defg굿굿굿k


하지만 뭔가 많이 불편해 보이죠? 

더군다나 실제 대상 문자열이 어떤 형태 인지 모를 경우 replace() 함수만을 이용하여 작업 하기에는 무리가 있어 보입니다. 

그래서 불특정 입력값을 변환하고자 할 경우 replaceAll() 함수에 Regular Expression (정규표현식)을 이용하여 개발을 많이 하고 있습니다. 

물론 replace() 함수도 많이 사용하고 있지만 사용 처가 약간 다르니 이정도는 이해 하고 넘어 가는게 좋을 것 같습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,