-
Beta Was this translation helpful? Give feedback.
Replies: 3 comments
-
|
불변 클래스 정리 중 5) 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.에서 String의 replace 메서드 String str = new String("abc");
str.replace("a", "z");
System.out.println(str);replace 메서드는 str 의 a를 z로 바꾸는 메서드 입니다. 결과를 보면 원하는 결과대로 이루어지 않고 원문 그대로 입니다. public String replace(CharSequence target, CharSequence replacement) {
String tgtStr = target.toString();
String replStr = replacement.toString();
int j = indexOf(tgtStr);
if (j < 0) {
return this;
}
int tgtLen = tgtStr.length();
int tgtLen1 = Math.max(tgtLen, 1);
int thisLen = length();
int newLenHint = thisLen - tgtLen + replStr.length();
if (newLenHint < 0) {
throw new OutOfMemoryError();
}
StringBuilder sb = new StringBuilder(newLenHint);
int i = 0;
do {
sb.append(this, i, j).append(replStr);
i = j + tgtLen;
} while (j < thisLen && (j = indexOf(tgtStr, j + tgtLen1)) > 0);
return sb.append(this, i, thisLen).toString();
}replace 메서드의 구현을 보니 기존 객체를 건드리지 않고 StringBuilder를 이용해 새로운 문자열 객체를 만들어 반환하는 것을 확인할 수 있습니다. (불변이니 당연히 해당 객체를 건들면 안되니...) 따라서 변수로 다시 받아줘야 새롭게 만들어져 반환한 객체를 참조할 수 있고 이렇게 코드를 수정하면 String str = new String("abc");
str = str.replace("a", "z");
System.out.println(str);원하는 결과로 나오는 것을 확인할 수 있었습니다. 저는 알고리즘 문제를 풀면서 replace 메서드를 제법 쓴 경험이 있는데 이러한 내부 동작을 잘 알지 못하고 그냥 replace만 쓰고 제대로 동작하지 않는다며 시간을 많이 낭비한 경험이 있습니다. @jinan159 님께서 불변 클래스의 예시로 드신 LocalDate 와 마찬가지로 String 클래스 또한 불변 클래스이고 이러한 불변클래스의 메서드들은 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 하기 위해 return을 자신 객체가 아닌 새로운 객체를 생성하여 반환하는 경우가 많을 수 있으니 참고 하시면 좋을 것 같습니다. 정리하신글 잘 읽었습니다. 감사합니다. |
Beta Was this translation helpful? Give feedback.
-
|
정리 감사합니다.! |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.








불변 클래스 정리 중
5) 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
에서
LocalDate 의 경우에는 return 문에서 항상 새로운 객체를 생성하여 반환하여 자신 외에 내부의 가변 컴포넌트에 접근할 수 없도록 한 부분을 보다가 String 객체의 멤버 메서드의 return 또한 이러한 경우가 제법 있었던 것으로 기억났습니다.String의 replace 메서드
replace 메서드는 str 의 a를 z로 바꾸는 메서드 입니다. 결과를 보면
원하는 결과대로 이루어지 않고 원문 그대로 입니다.