StringBuffer sb = new StringBuffer("abc");
StringBuffer sb = new StringBuffer("abc");
sb.append("123")
append()는 반환 타입이 StringBuffer인데 자신의 주소를 반환한다.
StringBuffer sb2 = sb.append("ZZ");
System.out.println(sb); // abc123ZZ
System.out.println(sb2); // abc123ZZ
StringBuffer클래스는 equals 메서드를 오버라이딩하지 않아서 StringBuffer 클래스의 equals 메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.
StringBuffer sb = new StrinBuffer("abc");
StringBuffer sb2 = new StrinBuffer("abc");
System.out.println(sb == sb2); // false
System.out.println(sb.equals(sb2)); // false
toString()은 오버라이딩 되어 있어서 StringBuffer 인스턴스에 toString()을 호출하면, 담고 있는 문자열 String으로 반환한다. 그러므로 문자열을 비교 하기 위해서 toString()을 호출해서 String 인스턴스를 얻은 다음 equals 메서드를 사용해서 비교해야한다.
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
StringBuffer는 멀티쓰레드에 안전(thread safe)하도록 동기화 되어 있다. 멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨린다. 그래서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다. StringBuffer와 완전히 똑같은 기능으로 작성 되어 있어서 StringBuffer 대신 StringBuilder를 사용하도록 바꾸기만 하면 된다.
StringBuilder sb = new StringBuilder();
sb.append("abc");
StringBuffer도 충분히 성능이 좋기 때문에 성능 향상이 반드시 필요한 경우를 제외하고 기존에 작성한 코드에서 StringBuffer를 StringBuilder로 굳이 바꿀 필요는 없다.