본문 바로가기

IT/Java언어

[Java] String, StringBuilder, StringBuffer 란?

안녕하세요 남갯입니다.


오늘은 String과 StringBuffer와 StringBuilder에 대해 알아보려고 합니다.



세 클래스의 비교

String , StringBuffer , StringBuilder

문자열을 관리하고 저장하는 클래스


String 은 immutable, StringBuffer,StringBuilder는 mutable하다는점




String 의 동작

String a = "aa"일 경우 heap영역의 String pool에 들어가게 되고

String b = new String("aa")일때는 heap에 객체를 생성하게 된다. 

즉 a == b 는 다르게 되지만

즉 String a = "aa"는 내부적으로 b.intern()이라는 함수를 통해 String pool에 등록된다.

b.intern()을 통해 String pool에 등록한 뒤 

a == b를 하게되면 해시코드가 같아진다.



String 의 연산

String은 new 연산자를 통해서 생성되면 인스턴스의 메모리 공간은 절대 변하지 않고 +연산이나 Concat을 이용해서 문자열에 변화를 줘도 메모리 공간이 변하는것이 아니라 String객체를 new로 새로운 메모리 공간을 만드는것이다.


예를들어

String aa = "aa";

String bb = new String("bb");

a = a+b로 동작을 하게될경우 

a메모리에 "aabb"가 들어가는게 아닌, 

새로운 메모리가 할당되게 됩니다.

이전에 참조하던 "aa"는 GC에 쓰레기가 되어 GC에 의해 처리되는데, 많은 연산을 할 경우 이런 성능차이는 계속 심해집니다.




StingBuilder와 StringBuffer는 어떻길래?


StringBuffer, StringBuilder 도 마찬가지로 문자열을 복사하지만 가변크기의 배열을 이용해서 필요에 따라 복사합니다. 


그럼 StringBuffer와 StringBuilder만 쓰면 되지 않는가??

성능은 두가지가 좋지만 String을 쓰는이유는

String은 불변 StringBuilder와 StringBuffer는 가변이기 때문에 스레드끼리의 데이터를 공유하더라도 동기화에 대해 안정성을 가지게 됩니다.



StringBuffer 와 StringBuilder의 원리


StringBuffer와 StringBuilder는 초기값인 16의 공간을 갖고있고 그 공간을 넘어서는 글자가 올경우 남아있는공간을 두배 늘리고 기존 문자열을 복사하는 형태로 동작합니다. 

따라서 문자열을 더하더라도 매번 문자열을 복사하지 않아서 성능을 높일 수 있습니다.



StringBuilder와 StringBuffer의 차이점


StringBuffer는 내부적으로 synchronized 키워드를 통해 멀티스레드 환경에서도 동기화를 지원하지만StringBuilder는 그렇지 않습니다.



+추가

String도 1.5버전부터 내부적으로 StringBuilder로 컴파일되도록 동작하고 있지만 문자열을 더할때는 매번 메모리를 할당한다는 사실은 변함이 없습니다.



결론

String은 짧은 문자열 or + 연산이 적을때

StringBuffer는 멀티스레드 환경에서 동기화가 필요할때

StringBuilder는 스레드 safe를 신경쓸 필요 없을때 이용합니다.







https://cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/


https://12bme.tistory.com/42