본문 바로가기

IT/Java

String, StringBuffer, StringBuilder란? (Synchronized 플러스 설명)

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