본문 바로가기

Java

String vs StringBuffer vs StringBuilder

공부하게 된 계기?

▶ 프로젝트를 진행하면서 문자열을 다루는 다양한 Classe들을 접하였습니다. 각 Class의 차이점과 용도에 대해서 의문이 생겼고, 리서치를 통해 알게 된 내용을 회고하고 기록하고자 합니다.


필요성

▶ 연산이 적을 때는 위에 나열된 어떤 Class를 사용하더라도 이슈가 발생할 가능성이 거의 없습니다. 하지만 연산 횟수가 많아지거나, Multi thread/Race condition 등의 상황이 자주 발생 한다면 각 Class의 특징을 이해하고 상황에 맞게 사용해야 합니다.

더보기

멀티 스레드(Multi thread): 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것

레이스 컨디션(Race Condition): 한정된 자원을 동시에 이용하려는 여러 프로세스가 자원의 이용을 위해 경쟁을 벌이는 현상


String vs StringBuffer/StringBuilder

▶ 대표적인 차이: String은 불변(Immutable)의 속성을 갖는다

 

String strTest = "hello";
strTest = strTest + "world";

 

  1. 위의 예제에서 "hello" 값을 가지고 있던 String Class의 변수 strTest가 가리키는 곳에 저장된 "hello"에 "world" 문자열을 더해 "hello world"로 변경한 것으로 생각할 수 있습니다.
  2. 하지만 기존에 "hello" 값이 들어가 있던 strTest가 "hello world"라는 값을 가지고 있는 새로운 메모리 영역을 가리키게 변경되고 처음 선언했던 "hello"로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(garbage collection)에 의해 사라지게 됩니다(String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 인스턴스가 생성된 것).
  3. 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주시면 좋은 성능을 기대할 수 있습니다. 그러나 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙 메모리 부족으로 성능에 치명적인 영향을 끼치게 됩니다.
  4. 이를 해결하기 위해 Java에서는 가변(mutable)성을 가지는 StringBuffer / StringBuilder 클래스를 도입했습니다. StringBuffer/StringBuilder는 .append() .delete() 등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는 것이 가능합니다. 따라서 문자열의 추가, 수정, 삭제가 빈번하게 발생할 경우라면 StringBuffer/StringBuilder를 사용해야 합니다

StringBuffer vs StringBuilder

  • 대표적인 차이: 동기화의 유무
  • StringBuffer: 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 입니다(참고로 String도 불변성을 가지기 때문에 마찬가지로 멀티 쓰레드 환경에서의 안정성을 가지고 있다).
  • StringBuilder: 동기화를 지원하지 않기 때문에 멀티 쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일 쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다.

 

 

※ 좋은 피드백과 첨언은 언제나 환영입니다.


참고자료

www.notion.so/String-vs-StringBuffer-vs-StringBuilder-cb4ae5c9a9a04ce184cdb640a03c07ed#cd059a640b494878ae41d4ee0a0bea50

'Java' 카테고리의 다른 글

Java의 메모리 영역  (0) 2023.04.21