StringBuffer -> StringBuilder
buffer -> builder 로 변경하는 코드는 아래와 같습니다.
public static void main(String[] args){
//buffer 생성
StringBuffer buffer = new StringBuffer(); buffer.append("Add in Buffer");
//builder 생성 StringBuilder builder = new StringBuilder(); builder.append(buffer);
//builder 출력 System.out.println(builder.toString());
} //결과 : Add in Buffer
How ?
StringBuffer와 StringBuilder는 클래스가 다른데 어떻게 builder에 buffer를 추가할 수 있을까요 ?
까보자 ! StringBuilder.class
//StringBuilder.class의 일부 public StringBuilder append(StringBuffer sb) { super.append(sb); return this; }
StringBuilder의 append() 를 확인해보니 StrungBuffer 형을 인자로 받는놈이 있습니다.
super.append(sb)
를 불러오네요.
여기서 잠깐! super.append(sb) ?
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { //... }
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence { //... }
StringBuildr.class
와 StringBuffer.class
는
AbstractStringBuilder.class
라는 추상클래스를 상속받고 있습니다.
이 두 클래스의 로직상 공통점이 많기 때문에 추상클래스 에서 많은 부분을 처리하는데요.
append()
도 super.append(StringBuffer sb)
로 넘겨버리네요.
추상클래스. AbstractStringBuilder.class
//AbstractStringBuilder.class의 일부 public AbstractStringBuilder append(StringBuffer sb) { if (sb == null) return appendNull(); int len = sb.length(); ensureCapacityInternal(count + len); sb.getChars(0, len, value, count); count += len; return this; }
자, 그럼 추상클래스의 append() 를 확인해보겠습니다.
getChars를 쓰는군요.
여기서 getChars는 value(builder 시작점)으로 부터 count(builder 길이) 만큼 떨어진 지점에
buffer 값( 0 ~ len(buffer길이) ) 을 복사합니다.
즉, builder 뒤에 buffer값이 붙은겁니다.
'Old Posts > Java' 카테고리의 다른 글
Final 과 Immutable 비교 <자바> (0) | 2018.03.19 |
---|---|
자바8 .collect(Collectors.joining()) 람다 (0) | 2018.02.09 |
String vs StringBuffer vs StringBuilder (0) | 2018.02.09 |
Thread (0) | 2018.01.17 |
Java Grammar ( for better Algorithm ) (0) | 2018.01.14 |