자바 언어에서는 replace()를 이용해 특정 문자를 다른 문자로 변경할 수 있는데,
오늘은 replace()를 이용해 어떻게 변경할 수 있는지와 해당 코드가 무엇인지 한번 살펴보도록 하자.
※하나는 더 알고가자!!
자바 문자열(String)은 불변(Immutable)한 특성을 가지고 있기 때문에,
원본 문자열은 그대로 Heap 메모리에 저장되어 있으며, 바뀐 문자열이 새로 생성 되어서 반환됩니다.
그래서 항상 바뀐 문자열을 반환값으로 받아야 한다.
자바 String객체에 문자열을 바꿀 수 있는 메서드는 다음과 같다.
String replace(char oldChar, char newChar)
-> 문자열내에 있는 모든!! oldChar를 newChar로 바꾼 문자열을 반환
String replace(CharSequence target, CharSequence replacement)
-> 문자열내에 있는 모든!! target문자열 replacement로 바꾼 문자열을 반환
String replaceAll(String regex, String replacement)
-> 문자열내에 있는 정규식 regex와 같은 모든!! 문자열을 replacement로 바꾼 문자열을 반환
String replaceFirst(String regex, String replacement)
-> 문자열내에 있는 정규식 regex와 같은 첫번째!! 문자열을 replacement로 바꾼 문자열을 반환
String old_word = "안녕하세요 저는 경영학을 전공하였습니다. 경영학 재밌어요";
String new_word = old_word.replace("학", "진");
System.out.println("원본 문장: " + old_word);
System.out.println("바뀐 문장: " + new_word);
다음 과 같이 한 단어가 모두 바뀐 것을 볼 수 있다.
String old_word = "안녕하세요 저는 경영학을 전공하였습니다. 경영학 재밌어요";
String new_word = old_word.replace("경영학", "컴퓨터공학");
System.out.println("원본 문장: " + old_word);
System.out.println("바뀐 문장: " + new_word);
위와 같이 원본 문자열과 새로운 문자열을 넣으면 모든!! 문자열이 변경된 것을 볼 수 있다.
CharSequence 객체를 인자로 받는데, 해당 객체는 String 객체를 상속하는 객체로, 다형성에 의해 String 객체를 인자로 주어도 된다.
※ 정규표현식이란?
문자열 데이터 중에서 원하는 조건(패턴)과 일치하는 문자열 부분을 찾기 위해 사용하는 것으로,
미리 정의된 기호와 문자를 이용해서 작성한 문자열을 의미.
더 알고 싶다면
정규표현식 <- 다른 블로그를 참고
replaceAll은 정규식을 이용해서 매치되는 문자열을 전부 바꿀 수 있는데,
필자는 정규식에 대해 잘 모르기 때문에 참고한 블로그 글을 인용하자면
String old_str = "코딩을 잘하고 싶다 . 하지만 , 그 길은 험난하다";
String new_str = old_str.replaceAll("(\\w|[ㄱ-ㅎ가-힣]*)(\\s+)([\\.,])", "$1$3");
System.out.println(old_str);
System.out.println(new_str);
마침표와 콤마 앞 공백이 없어진 것을 볼 수 있다.
정리:
이렇게 정규식을 이용해 문자열을 치환하고 싶을때, replaceAll을 사용할 수 있다.
정규식 공부를 짤막하게 해보고자 해당 코드를 해석해보았다.
(): 그룹 -> 지금 총 그룹이 3개가 존재한다는 것을 볼 수 있다.
\\w: 문자만 허용하는 정규표현식 이것은(a-z,A-Z,0-9..)을 허용
※ 번외 \\W(대문자): 반대로 문자가 아닌 경우에만 허용 즉, ! not을 의미
| : 또는
[ㄱ-ㅎ가-힣] -> 한글이 다 허용된다고 해석할 수 있다.
*: 없거나 있거나 많거나 (zero or more)
즉 첫번쨰 그룹 (\\w|[ㄱ-ㅎ가-힣]*)을 해석하면
문자만 허용 혹은 한글을 허용하되 없을 수도 있거나 많을 수 있다.
\\s: 공백 문자, 탭만을 허용만 정규 표현식
※ 번외: \\S(대문자) 는 위와 같이 ! not을 의미
+: 하나 또는 많이 (one or more)
즉 두번쨰 그룹 (\\s+)을 해석하면
하나 이상의 공백 문자를 나타낸다고 해석할 수 있다.
[\\.,]: .(마침표)과 ,(콤마)를 의미
$: 그룹을 참조할 때 사용
-> 어설션의 $와는 다른 부분이라고 생각
치환될 문자열을 해석하면
$1$3: 이 부분은 치환할 문자열을 나타내는데
$1은 첫 번째 그룹을, $3은 세 번째 그룹을 나타냅니다.
그렇기 때문에 해석하면 두 번째 그룹은 치환에서 제외된다고 볼 수 있다.
요약:
따라서 이 코드는 주어진 문자열에서 알파벳, 숫자, 밑줄, 한글 문자와
하나 이상의 공백 문자 사이에 있는 마침표 또는 쉼표를 제거합니다.
처음 매칭되는 문자 하나만 변경시키는 메서드로 예제를 보면서 바로 알아보자
String old_str = "경영학은 재밌어요, 그치만 경영학은 어려워요";
String new_str = old_str.replaceFirst("경영학", "컴퓨터공학");
System.out.println(old_str);
System.out.println(new_str);
여기까지 치환 메서드에 대해서 간략하게 알아봤다.