001. 8/27 TIL

‍박태우·2024년 8월 27일

nbc_spring

목록 보기
2/28

앞으로의 TIL 다짐

  • 모든 내용을 정리하지 않는다.
  • 중요한내용, 혹은 발생한 문제를 해결하는 과정을 기술하는 느낌으로 가고 싶다.

'replace' vs 'replaceAll' [JAVA]

문제 : 숫자문자열과 영단어 (프로그래머스)

카카오 채용연계형 인턴십 코딩 테스트에 나왔던 문제로서

input : "one4seveneigth" (String)
output : 1478 (int)

즉 one, two 와 같은 문자열을 숫자 1, 2 로 대치하여 int 형태로 반환하는 문제이다.

내가 작성한 코드 :

package Programmers_nbc;

public class Pr_46 {

	static class Solution {
		public static int solution(String s) {
			int answer = 0;
			String[] number = { "zero", "one", "two", "three", "four", 
            "five", "six", "seven", "eight", "nine" };

			for (int i = 0; i < number.length; i++) {
				s = s.replace(number[i], String.valueOf(i));
				//number[i] 와 일치하는 것을 모드 String.valueOf(i) 값으로 변경한다.
				//replace와 replaceAll 의 결과가 동일하다
			}
			answer = Integer.parseInt(s);
			return answer;
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(Solution.solution("one4"));

	}

}

=> 문자열을 대치 할 수 있는 replace 함수를 검색해서 해당 함수를 해결하여 그렇게 어렵지 않게 해결하였지만 위 for 문 내부의 replace 를 replaceAll 로 바꿔도 정답처리가 되었다. 그렇다면 무엇이 다르기에 replace 와 replaceAll 메서드가 따로 있는 것인지 알아보고 싶어서 조사해보았다.

* replace

String str = "onetwothreefourfiveone";
str = str.replace("one","One");
//replace(기존문자, 바꿀문자)

System.out.println(str);
// "OnetwothreefourfiveOne"

=> replace 는 해당하는 문자열을 특정한 문자열로 치환한다.

* replaceAll

String str = "onetwothreefourfiveone";
str = str.replaceAll("one","One");
//replaceAll(정규표현식, 바꿀문자)

System.out.println(str);
// "OnetwothreefourfiveOne"

=> replacAll 또한 replace 와 같이 특정 문자를 찾아서 모두 문자열을 치환해 주는 것 처럼 보이지만 첫번째 인자로 정규표현식 이 들어간다는 차이점이 있다 따라서 아래와 같은 코드에서는 예상치 못한 결과가 나오게 된다.

String str = "one.twothreefourfive.one";
str = str.replaceAll(".","/");
//replaceAll(정규표현식, 바꿀문자)

System.out.println(str);
// "////////////////////////"
// replace(".","/"); 를 하게 되면 
// "one/twothreefourfive/one" 이 된다.

=> 정규표현식 . 은 모든 문자를 선택하라는 의미로서 따라서 모든 문자가 / 로 치환되게 된다.

추가 메서드 replaceFirst

String str = "onetwothreefourfiveone";
str = str.replaceFirst("one","One");
//replaceFirst(기존문자, 바꿀문자)

System.out.println(str);
// "Onetwothreefourfivone"

=> 이전 메서드들은 모든 해당하는 문자열을 치환하는 반면 replaceFirst의 경우는 처음으로 나오는 해당되는 문자만 치환하는 것을 알 수 있다.


오늘의 소감 : 오늘은 짧게 내가 몰랐던 내용만 정리해보는 TIL 이었던 것 같다. 뭔가 짧은 것도 같지만 내가 평소에 보던 여러 블로그들의 TIL 또는 정보 제공 형식과 비슷한 것 같다. 모르는 것 위주로 하다보니 매일의 TIL의 길이가 달라질 수도 있지만 확실하게 내가 모르는 것을 정리 할 수 있다는 장점이 있어서 좋았던 것 같다. 좀더 노력하는 TIL이 될 수 있도록 노력하고 싶다.

profile
잘 부탁드립니다.

0개의 댓글