[JAVA] String 문자열과 StringBuilder, StringBuffer의 비교

2021. 11. 16. 17:18[JAVA]

반응형

Java에서 문자열을 다루는 클래스는 String, StringBuilder, StringBuffer가 있다.

문자열의 연산이 많이 발생할 때를 생각하면 위 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 한다.

String과 StringBuffer/StringBuild 클래스의 가장 큰 차이점은 String은 불변(immutable)의 속성을 갖는다는 점이다.

String str = "Hello";
str+=" world";

위의 코드를 보면 문자열 str이라는 변수가 Hello world로 변경된 것으로 착각할 수 있다.

하지만 기존에 "Hello"값이 들어가 있던 String 클래스의 참조변수 str이 "Hello world"라는 값을 가지고 있는 새로운 메모리영역을 가리키게 변경되고 처음 선언했던 "Hello"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있따가 GC(Garbage Collection)에 의해 사라지게 된다. String 클래스는 불변성을 가지고 있기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성된 것이다.

추가로 리터럴문자로 초기화 할 경우에는 String Pool에 저장이 되고 new로 초기화 하는 경우에는 Heap 영역에 저장된다.

위와 같이 String은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주시면 좋은 성능을 기대할 수 있다. 그러나 문자열 추가, 수정,삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 된다.

이렇게 연산이 빈번하게 일어나는 문자열을 다루기 위해 Java에서 가변성(Mutable)을 가지는 StringBuffer와 StringBuilder 클래스를 도입했다.

String과는 반대로 StringBuffer/StringBuilder는 가변성을 가지기 때문에 .append(), .delete() 등의 API를 잉용하여 동일 객채네에서 문자열을 변경하는 것이 가능하다. 따라서 문자열의 CRUD(삽입,추가,삭제,수정) 작업이 많이 일어나면 Stringbuffer와 StringBuilder를 사용해야 한다.

StringBuffer VS StringBuilder

StringBuffer와 StringBuilder의 차이는 동기화의 유무이다. StringBuffer는 동기화 키워드를 지원해서 멀티쓰레드 환경에서 안전하다 String도 불변성을 가지기 때문에 멀티쓰레드 환경에서 안정성을 가진다.

 

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

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

 

출처 : https://ifuwanna.tistory.com/221

반응형