StringBuffer 클래스는 스레드에 안전하게 설계되어 있으므로, 여러 개의 스레드에서 하나의 StringBuffer 객체를 처리해도 전혀 문제가 되지 않는다. 하지만 StringBuilder는 단일 스레드에서의 안전성만을 보장한다. 그렇기 때문에 여러 개의 스레드에서 하나의 StringBuilder 객체를 처리하면 문제가 발생한다.


CharSequence는 인터페이스이다. 

이 인터페이스를 구현한 클래스로는 CharBuffer, String, StringBuffer, StringBuilder가 있으며 

StringBuffer나 StringBuilder로 생성한 객체를 전달할 때 사용된다.


두 클래스에는 아래 표와 같이 4개의 생성자가 있다. 필요에 따라서 생성자를 선택해 사용하기 바란다.



생성자

 StringBuffer(), StringBuilder()

아무 값도 없는 객체를 생성한다. 기본용량은 16개의 char이다. 

 StringBuffer, StringBuilder

(CharSequence seq)

CharSequence를 매개변수로 받아 그 seq 값을 갖는 객체를 생성 

 StringBuffer, StringBuilder

(capacity)

 capacity에 지정한 만큼의 용량을 갖는 객체를 생성한다.

 StringBuffer, StringBuilder

(String str)

str의 값을 갖는 객체를 생성한다. 


public class Test {
	public static void check(CharSequence cs) {
		StringBuffer sb = new StringBuffer(cs);
		System.out.println("sb.length() : " + sb.length());
	}
	
	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder();
		sb.append("Test");
		check(sb);
	}
}

String의 길이는 정상적으로 처리된다. StringBuffer나 StringBuilder로 값을 만든 후 굳이 toString을 수행하여 필요 없는 객체를 만들어서 넘겨주기 보다는 CharSequence로 받아서 처리하는 것이 메모리 효율에 더 좋다.


[ 출저 ] - 자바 성능 튜닝 이야기 Page 45 - 49


블로그 이미지

행복그리고..

,