String, StringBuffer, StringBuilder::자바

2020. 7. 3. 14:20computer science/java

 자바에서 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있습니다.

 

 연산 횟수가 많아지거나 멀티스레드, Race Condition 등의 상황이 자주 발생한다면 각 클래스의 특징을 이해하고, 상황에 맞는 적절한 클래스를 사용해야 합니다(Race Condition이란? -> https://junboom.tistory.com/29).

 

1. String

 

 불변의 속성을 가집니다.

 

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

 

 위 상황에서 str 변수가 "Hello"에서 "Hello world"로 변환된다고 생각할 수도 있지만,

 

 

 실제로는 "Hello" 객체에서 "Hello world"라는 새로운 객체를 참조하게 되어 "Hello" 객체는 Garbage Collection 대상이 됩니다.

 

 문자열을 자주 읽을 때 String 클래스를 사용하면 좋은 성능을 기대할 수 있지만, 문자열 추가, 수정, 삭제 등의 연산이 빈번하게 발생되는 알고리즘에 String 클래스를 사용하면 Heap 메모리에 많은 Garbage가 생성되고, 애플리케이션 성능에 치명적인 영향을 끼칩니다.

 

 

2. StringBuffer vs StringBuilder

 

공통점

 

 String의 불변성을 해결하기 위해 도입된 클래스로 가변의 속성을 가집니다.

 

 .append(), .delete() 등의 메서드를 통해 동일 객체 내에서 문자열을 변경할 수 있습니다. 따라서 문자열 추가, 수정, 삭제가 빈번하게 발생되는 알고리즘에 사용하는 것이 적합합니다.

 

차이점

 

 StringBuffer는 동기화를 지원해 멀티스레드 환경에서 안전(Thread Safe)합니다.

 (String 또한 불변성을 가지기 때문에 Thread Safe)

 

 StringBuilder는 동기화를 지원하지 않아 멀티스레드 환경에서 안전하지 않습니다.

 하지만, 동기화를 고려하지 않기 때문에 단일스레드에서의 성능은 StringBuffer보다 뛰어납니다.

 

  String StringBuffer StringBuilder
메모리 영역 String Pool Heap Heap
성질 불변성 가변성 가변성
Thread Safe 안전 안전 불안전
동기화 동기 동기 비동기
성능 읽기 속도 빠름 비교적 느림 추가, 수정, 삭제 속도 빠름

 

'computer science > java' 카테고리의 다른 글

가비지 컬렉션(GC) 알고리즘과 여러 방법::자바  (2) 2020.07.07
Vector와 ArrayList 비교::자바  (2) 2020.07.03
OOP와 SOLID::자바  (2) 2020.06.13