안녕하세요. 제임스 입니다.
이번에는 자바 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
'Java' 카테고리의 다른 글
[ 자바 코딩 ] toLowerCase(), toUpperCase(), trim() (6) | 2017.11.24 |
---|---|
[ 자바 코딩 ] Java startsWith(), endsWith() (7) | 2017.11.23 |
[ 자바 코딩 ] Java compareTo(), compareToIgnoreCase() 함수 (6) | 2017.11.15 |
[ 자바 코딩 ] 자바 charAt(), indexOf(), lastIndexOf(), length() (6) | 2017.11.14 |
[자바 코딩] 자바 랜덤 함수 (4) | 2017.09.29 |