본문 바로가기
TIL

replace() 와 replaceAll() 의 차이 (22.09.06 TIL)

by winteringg 2022. 9. 6.

 오늘 프로그래머스 문제를 풀다가 문자열을 치환해주는 메서드를 검색해봤는데 replace() 라는 메서드를 발견해서 그걸로 답을 풀어낸 후 제출을 했다. 다른 사람의 풀이를 보니 replaceAll() 이라는 메서드를 사용한 것도 있어서 '이름은 같은데,,아예 다른 기능을 하는 메서드인가?' 라는 궁금증이 생겨 한 번 찾아보았다.

 일단 문제는 문자로 입력된 영문 숫자명을 모두 숫자로 바꾸어 출력해주는 함수를 만드는 것이고, 그에 대한 풀이이다.

class Solution {
    public static void main(String[] args) {
        //테스트 코드
        Solution solution = new Solution();
        System.out.println(solution.solution("one45six"));
    }
    public int solution(String s) {

        String[] num = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

        for(int i = 0; i < 10; i += 1){
            s = s.replace(num[i], Integer.toString(i));
        }

        int answer = Integer.parseInt(s);

        return answer;
    }
}

 replace() 라는 메서드를 사용해서 문자열을 숫자문자열로 치환해주었다. 그런데 replaceAll() 이라는 메서드를 사용해도 결과는 동일하다. 둘의 차이점은 무엇일까? 아래 표는 Oracle API doc (Java SE 18) 에서 검색한 내용이다.

메서드 설명
public String replace(CharSequence target, CharSequence replacement) 문자열 중에서, 지정된 대상 문자열(target)과 일치하는 문자열을 주어진 대체(replacement) 문자열로 바꿔 반환한다.
String replaceAll(String regex, String replacement) 문자열 중에서 주어진 정규 표현식(regex)과 일치하는 문자열의 각 부분 문자열을 주어진 대체(replacement) 문자열로 바꿔 반환한다.

 선언부의 매개변수명을 통해 두 메서드의 차이를 알 수 있다. replace() 는 특정 문자열을 새로운 문자열로 대체하기 위한 메서드이고, replaceAll() 은 정규식에 일치하는 문자열들을 전부 다른 문자열로 대체하기 위한 메서드인 것이다.


+ 본문과 다른 추가적인 개념 정리

1. CharSequence 란?

- 위에 나온 메서드들은 java.lang 이라는 패키지 안에 있는 String 이라는 클래스의 메서드이다. 하지만 CharSequence 는 클래스가 아닌 인터페이스이다. character + sequence 에서 짐작되듯이, char 값을 읽을 수 있는 시퀀스이다. 이 시퀀스를 implement 하여 구현된 대표적인 클래스로는 String, StringBuilder, StringBuffer 등이 있다.

- 자바에서 String 객체 내에 보관하는 문자열은 유니코드로 변형하여 보관하므로 HTML 고 같은 마크업 문자를 입력하고 출력할 때 문제가 발생한다. 따라서 String 객체에 입력되는 문자열은 마크업 문자를 입력하여 사용할 수 없는 문자열이다.

- 반면에 CharSequenct 객체 내에 보관하는 문자열은 같은 String 클래스와 유니코드라 하더라도 마크업 문자를 사용하여 변형과 가공이 가능한 문자열이다.

2. 정규식(Regular Expression, regex) 이란?

- 문자열에서 특정한 형태나 규칙을 가진 문자열을 찾아내기 위해 나타내는 패턴식이다. 예를 들어, 이메일 형태가 올바른지 체크하거나 아이디 형태가 올바른지, 특수문자가 들어있지는 않은지 등을 체크하기 위해 사용한다.

- 정규식은 . [] [^] ^ $ () \n * {} 등의 특수문자와 영문, 숫자 등의 조합으로 구성할 수 있다. 프로그래밍에서 자주 사용되는 기본 정규식은 아래와 같다.

**참고) 아래 사이트는 정규 표현식을 연습할 수 있는 사이트이다.

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

댓글