String
- 문자열을 처리하는 특별한 시스템 클래스의 객체이며, 변형 불가능(immutable)하다.
(String 클래스의 객체는 Heap 상에 생성될 경우 한버에 생성된 객체의 내부 내용을 변화시킬 수 없다는 뜻)
- String 인스턴스를 생성할 때 메모리의 힙 영역에 할당되며 다시는 바꿀수가 없다.(문자열이 더해질 때 마다 새로운 힙 영역이 할당되며 메모리를 많이 차지하게 됨)
StringBuffer, StringBuilder
- StringBuffer와 StringBuilder는 String과는 다르게 변형 가능(mutable)하다.
- 내부적으로 배열의 형태로 선언되기 때문에 문자열 처리 후 새로운 인스턴스가 할당되는 것이 아닌 기존의 객체에 이어 붙인다. 따라서 훨씬 속도도 빠르고 공간의 낭비도 적다.
- StringBuffer: 동기화 지원(Synchronized)
- StringBuilder: 동기화 지원 안함
* 3개의 성능을 비교해보면 StringBuilder > StringBuffer > String 순으로 StringBuilder가 제일 빠름
ex) StringBuilder나 Stringbuffer로 선언한 객체를 읽기위해선 toString()메소드로 String 인스턴스를 반환해야 함
StringBuilder buf = new StringBuilder();
buf.append(sourceMap.get("ERROR_MESSAGE"));
if (buf != null && !buf.toString().isEmpty()) {
returnStr = getMessage("MSG_SAVE_FAILURE") + "<br><br>";
returnStr += buf.toString().replaceAll(",", "<br>");
}
Synchronized란?
- 공유 데이터에 lock을 걸어 작업중이던 쓰레드가 마칠때까지 다른 쓰레드에게 제어권이 넘어가지 않게 보호한다.
- Synchronized 블럭이 끝나면 lock이 풀리고 다른 쓰레드도 접근 가능하게 된다.
- 교착상태(dead-lock)이 빠질 위험이 있으므로 주의한다.
참고: http://warmz.tistory.com/entry/Thread쓰레드-동기화Synchronized