[Java] 문자열 치환(replace)에 대해 알아보자

hansung's·2024년 2월 20일
0

😊 개요

자바 언어에서는 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로 바꾼 문자열을 반환

1. replace(char oldChar, char newChar) 메서드

String old_word = "안녕하세요 저는 경영학을 전공하였습니다. 경영학 재밌어요";
String new_word = old_word.replace("학", "진");

System.out.println("원본 문장: " + old_word);
System.out.println("바뀐 문장: " + new_word);


다음 과 같이 한 단어가 모두 바뀐 것을 볼 수 있다.

2. String replace(CharSequence target, CharSequence replacement) 메서드

String old_word = "안녕하세요 저는 경영학을 전공하였습니다. 경영학 재밌어요";
String new_word = old_word.replace("경영학", "컴퓨터공학");

System.out.println("원본 문장: " + old_word);
System.out.println("바뀐 문장: " + new_word);

위와 같이 원본 문자열과 새로운 문자열을 넣으면 모든!! 문자열이 변경된 것을 볼 수 있다.

CharSequence 객체를 인자로 받는데, 해당 객체는 String 객체를 상속하는 객체로, 다형성에 의해 String 객체를 인자로 주어도 된다.

3. String replaceAll(String regex, String replacement) 메서드

※ 정규표현식이란?
문자열 데이터 중에서 원하는 조건(패턴)과 일치하는 문자열 부분을 찾기 위해 사용하는 것으로,
미리 정의된 기호와 문자를 이용해서 작성한 문자열을 의미.

더 알고 싶다면
정규표현식 <- 다른 블로그를 참고

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은 세 번째 그룹을 나타냅니다. 
그렇기 때문에 해석하면 두 번째 그룹은 치환에서 제외된다고 볼 수 있다.

요약:
따라서 이 코드는 주어진 문자열에서 알파벳, 숫자, 밑줄, 한글 문자와 
하나 이상의 공백 문자 사이에 있는 마침표 또는 쉼표를 제거합니다.

4. String replaceFirst(String regex, String replacement) 메서드

처음 매칭되는 문자 하나만 변경시키는 메서드로 예제를 보면서 바로 알아보자

String old_str = "경영학은 재밌어요, 그치만 경영학은 어려워요";
String new_str = old_str.replaceFirst("경영학", "컴퓨터공학");

System.out.println(old_str);
System.out.println(new_str);

여기까지 치환 메서드에 대해서 간략하게 알아봤다.

❤ 참고자료

자바 문자열에서 특정문자를 다른 문자로 바꾸기

정규표현식

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글