문장 속에서 특정 단어를 찾아 별표(*)로 바꿔야 하는 경우가 종종 있습니다. 민감한 정보를 가리거나 퀴즈의 빈칸 문제를 만들 때처럼 말이죠. 이번 글에서는 자바(Java)를 활용해 문장에서 지정한 패턴과 일치하는 단어를 같은 길이의 별표 문자열로 대체하는 프로그램을 만들어 보겠습니다.
예제 코드
public class Demo{
static String replace_word(String sentence, String pattern){
String[] word_list = sentence.split("\\s+");
String my_result = "";
String asterisk_val = "";
for (int i = 0; i < pattern.length(); i++)
asterisk_val += '*';
int my_index = 0;
for (String i : word_list){
if (i.compareTo(pattern) == 0)
word_list[my_index] = asterisk_val;
my_index++;
}
for (String i : word_list)
my_result += i + ' ';
return my_result;
}
public static void main(String[] args){
String sentence = "This is a sample only, the sky is blue, water is transparent ";
String pattern = "sample";
System.out.println(replace_word(sentence, pattern));
}
}실행 결과
This is a ****** only, the sky is blue, water is transparent
코드 동작 원리
위 프로그램의 핵심은 replace_word라는 정적(static) 메서드입니다. 이 메서드는 문장과 찾고자 하는 패턴, 두 개의 매개변수를 받아 치환 작업을 수행합니다.
1. 문장을 단어 배열로 분리
sentence.split("\\s+") 정규식을 사용하면 공백을 기준으로 문장이 잘리고, 각 단어가 문자열 배열 word_list에 순서대로 저장됩니다.
2. 별표 문자열 생성
패턴의 길이만큼 반복문을 돌며 '*' 문자를 이어 붙여, 원래 단어와 길이가 동일한 별표 문자열을 미리 만들어 둡니다. 덕분에 "sample"(6글자)은 "******"(별표 6개)로 자연스럽게 대체됩니다.
3. 단어 비교 후 치환
향상된 for문으로 배열을 순회하면서 compareTo() 메서드로 각 단어와 패턴을 비교합니다. 두 문자열이 완전히 일치하면(compareTo의 반환값이 0) 해당 위치의 단어를 별표 문자열로 교체합니다.
4. 결과 문자열 조립
마지막으로 치환이 끝난 모든 단어를 공백과 함께 이어 붙여 하나의 문장으로 만든 뒤 반환하고, main 메서드에서 콘솔에 출력합니다.
참고: 더 나은 구현을 위한 팁
실무에서 활용한다면 몇 가지를 개선하면 좋습니다.
- StringBuilder 사용: 문자열 연결에
+연산자를 반복해서 쓰면 새로운 객체가 계속 생성되므로,StringBuilder나String.join(" ", word_list)를 사용하는 것이 효율적입니다. - 대소문자 무시:
compareToIgnoreCase()를 사용하면 "Sample", "SAMPLE" 같은 단어도 함께 치환할 수 있습니다. - trim() 호출: 마지막 단어 뒤에 붙는 불필요한 공백은
my_result.trim()으로 제거하면 출력이 깔끔해집니다.
이처럼 split과 compareTo만 활용하면 별도의 외부 라이브러리 없이도 간단하게 단어 마스킹 기능을 구현할 수 있습니다.