String,StringBuffer,StringBuilder

업데이트:


String,StringBuffer,StringBuilder 모두 JAVA에서 문자열을 저장하고 관리하는 클래스이다.

String : 문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우

String과 StringBuffer,StringBuilder의 차이

String과 StringBuffer,StringBuilder의 가장 큰 차이점은 String은 불변(immutable)의 속성갖고 StringBuffer,StringBuilder는 가변(mutable)속성을 갖는다는 점이다.

String은 불변성을 가지고있기 때문에 멀티쓰레드 환경에서의 안정성을 가지고 있다.

String객체와 String리터럴

String str1 = new String("a"); // new로 생성
String str2 = "a"; // 리터럴로 생성

new연산자를 통해 문자열 객체를 생성하는 경우 메모리의 Heap영역에 할당된다.
리터럴을 이용해 문자열을 생성한 경우 String Constant Poll영역에 할당된다.
상수풀의 위치는 JAVA7부터 Heap 영역으로 옮겨졌다고 한다.


String의 불변성

String str = new String("a"); // new로 생성
str1 = str + "b";

만약 String 클래스의 참조 변수 str이 가리키는 메모리 영역에 ‘a’가 저장되어 있었는데, 그 문자열에 +로 다른 문자열을 붙여도 그 문자열에 새로운 문자열을 붙는게 아니라 Heap영역에 새로운 String객체를 만든 후, 새 String객체에 연결된 문자를 저장하고, 그 객체를 참조하도록 한다.
기존 ‘a’값으로 할당된 메모리 영역은 Garbage로 남아있다가 GC에 의해 삭제된다.
이처럼, String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우에 사용하면 좋은 성능을 낼 수 잇지만, 추가,수정,삭제 등 연산이 빈번하게 발생하는 곳에서 사용된다면 Heap메모리 영역에 임시 Garbage가 생성되어 성능에 영향을 미친다.

StringBuffer와 StringBuilder는 가변성 클래스로, append(), delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능하다
따라서 문자열의 추가,수정,삭제가 빈번히 일어난다면 StringBuffer나 StringBuilder를 사용하는게 좋다.

StringBuffer sb = new StringBuffer("a");
sb.append("b");



StringBuffer과 StringBuilder의 차이

StringBuffer는 동기화 키워드를 지원해서 멀티쓰레드 환경에서 안전하다.
StringBuilder는 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서 사용하는 것은 적합하지 않다.
하지만 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.

태그:

카테고리:

업데이트:

댓글남기기