로또 1단계 미션을 반영하면서 공백을 제거하기 위해 replaceAll
을 사용하였다.
이에 대해 replace
와 replaceAll
의 차이가 무엇인지 피드백을 받았다.
어... 뭐지? 뭘까? 찾아봐야겠다!
먼저 자바의 문자열은 불변(Immutable Object)이다. 불변객체는 재할당은 가능하지만, 한번 할당하면 내부 데이터를 변경할 수 없은 객체를 말한다. 따라서 자바에서는 문자열을 수정할 때, 원본은 그대로이고 바뀐 문자열을 반환값으로 받아야 한다.
String str = "ABC"; // 원본
String text = str.replace('C','D'); // 문자열을 수정하고 반환된 값을 할당
replace()
, replaceAll()
, replaceFirst()
메서드를 확인해보면 모두 String
으로 값을 반환하는 것을 확인할 수 있다.
public String replace(char oldChar, char newChar)
Char 타입의 인자를 받아, oldChar
를 newChar
로 바꾼다.
public replace(CharSequence target, CharSequence replacement)
CharSequence 타입의 객체를 받아 수정한다. CharSequence는 char값을 읽을 수 있는 시퀀스로 이를 구현하여(implements) String, SpanneableStringBuilder, StringBuilder, StringBuffer 등이 만들어졌다. 따라서 다형성에 따라 String 타입을 받을 수 있다.
String str = "오늘 날씨는 흐림입니다.";
String text = str.replace("흐림", "맑음");
System.out.println(text);
결과) 오늘 날씨는 맑음입니다.
public String replaceAll(String regex, String replacement)
regex
즉, 정규표현식을 사용해서 매치되는 문자열을 바꾼다. 정규표현식은 문자열에서 공백, 숫자 등 패턴을 찾을 때 도움을 주는 식을 말한다.
우리는 공백을 찾아 제거하는 것이 목적이었기 때문에 \\s
를 사용할 수 있다. 아무래도 공백이 여러 형태로 입력될 수 있으니 이 방법이 좋을 것 같다.
String str = "공백 제거";
String text = str.replaceAll("\\s","");
System.out.println(text);
결과) 공백제거
public String replaceFirst(String regex, String replacement)
문자열내에 있는 정규식과 매치되는 첫번째 문자열만 바꿔서 반환한다.
String str = "가나다가나다가나다라";
String text = str.replaceFirst("가나다", "마바사");
System.out.println(text);
결과) 마바사가나다가나다라
알게된 내용을 전달하면서 사용하고 있는 메서드의 파라미터에 대해 제대로 알고 사용해야겠다라는 생각을 했다.
Reference