JAVA

String vs StringBuffer vs StringBuilder

응디 2022. 7. 5. 17:08

String

: 문자열 연산이 적고 멀티쓰레드 환경일때 (문자의 변동이 적을때 - 불변성)

 

String의 예시로 아래 코드를 살펴보자. (hello로 선언한 값을 hello world로 바꿔주는 예)

 

기존에 hello라는 값을 가지고 있던 memory영역이 있고 hello world는 새로운 영역에 할당된다.

그렇다면 처음에 할당된 hello가 담겨있는 메모리 영역은 Garbage로 남아있다가 GC(Garbage Collection)에 의해 사라지게된다.

 

String 클래스는 불변하기 때문에 기존의 memory영역이 수정되지 않고 새로운 영역이 생성되는것

String str = new String("hello");
str = str + " world";

만약 문자열 추가, 수정, 삭제 등의 연산이 많은 알고리즘에서 이렇게 불변성을 가지는 String을 자주 읽어들이면 힙 메모리에 많은 Garbage가 생성되어 힙메모리 부족으로 성능에 영향을 끼침!

 

이러한 문제점을 해결하려면? StringBuffer or StringBuilder 사용!

 

StringBuffer/StringBuilder는 가변성을 가지기 떄문에 append, delete등의 api를 이용하여 문자열 변경이 가능하다.

문자열의 수정, 추가, 삭제가 자주 발생하는 경우에는 StringBuffer/StringBuilder를 사용하는게 낫다.

StringBuffer sb = new StringBuffer("hello");
sb.append(" world");

 

그렇다면 StringBuffer/StringBuilder 의 차이점은 뭘까??

 

StringBuffer vs StringBuilder

가장 큰 차이점은 동기화의 유무!

 

이때 동기화란?

: 동기화는 여러개의 스레드가 한개의 자원을 사용하고자 할 때 해당 스레드만 제외하고 나머지는 접근을 못하게 막는것

→ 동기화를 하지 않으면 하나의 자원을 여러 스레드가 접근해 값이 뒤바뀌거나 사용자가 의도한 대로 결과값이 나타나지 않을수도 있다.

 

StringBuffer는 동기화를 지원하여 멀티스레드 환경 안에서 안전하다.

또한 String도 불변성을 가지고 있기 때문에 멀티스레드 환경에서 사용이 적합하다.

 

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