String과 StringBuffer의 차이점



public class StringEx3 {
	public static void main(String[] args){
		String stringSql = "select"
				+ " name"
				+ " from board"
				+ " where num=?";
		System.out.println(stringSql);
		
		StringBuffer bufferSql  = new StringBuffer();
		bufferSql.append("select");
		bufferSql.append(" name");
		bufferSql.append(" from board");
		bufferSql.append(" where num=?");
		String sql = bufferSql.toString();
		System.out.println(sql);
	}	
}
/* output
select name from board where num=?
select name from board where num=?
*/

String을 쓰다가 (+)연산자를 이용하면 내부적으로 계속 new 연산자를 이용해서 새로운 힙 메모리를 만들게 된다. 

/* 이 부분에 대해서 윤성우씨의 난 정말 java공부한 적이 없다고요 책을 참고하였다.*/

/*  StringBuffer를 이용해 내부 구현한 부분 (http://skynaver.tistory.com/128에서 참조)

stringSql = "select";

stringSql += " name";

stringSql = new StringBuffer(stringSql).append(" name").toString(); */

메모리 낭비일뿐만 아니라 GC가 이를 소멸시키는 과정에서 속도에도 영향을 준다. 
또한 String을 쓰면 DB에서 수많은 sql query가 발생하는데 이때마다 엄청난 양의 메모리가 소모된다. 

하지만 StringBuffer를 쓰게 된다면 새로운 메모리를 만드는 대신에 기존의 메모리에 작업을 하게 된다. 
append는 첨부하다 덧붙이다라는 뜻을 가지고 있는데, 이를 음미하면 좀더 이 객체를 쉽게 이해할 수 있을것이다. 

처리시간의 면에서 본다면 StringBuilder, StringBuffer, String 순이다. 
StringBuffer는 내부 함수들이 Synchronized로 되어있어 여러 개의 쓰레드Multi-threads에서 안전성을 보장한다.(사용해도 문제가 없다.) 하지만 이로 인해 성능저하가 발생한다. 

StringBuilder는 쓰레드에 안전한지 여부가 상관없는 혹은 단일 쓰레드일때 사용되는데, 속도면에서는 제일 빠르다.




'Java' 카테고리의 다른 글

[Java] list와 향상된 for문  (2) 2014.02.09
[Java] 2차원 배열의 길이  (0) 2014.02.08
[Java] 메모리 관점에서 본 String  (0) 2014.01.24
[Java] 상수(Constant)  (0) 2014.01.24
[Java] String constant pool  (0) 2014.01.24
Posted by marvell
,