자바에서 대표적인 문자열 관련 클래스는 String, StringBuilder, StringBuffer가 있다.
1. String
String 클래스는 불변이다. 즉, 한번 생성된 문자열 객체는 변할 수 없다.
예를 들어 문자열 결합, 분리 등을 할 경우 본래의 문자열 객체를 수정하는 것이 아니라 새로운 문자열 객체를 생성하게 된다.
String str = "Hello"; // Hello
str = str + " World"; // Hello World
위와 같이 문자열 결합을 할 경우 기존의 "Hello" 문자열을 수정하는 것이 아니라
"Hello World"라는 새로운 문자열 객체를 생성하고
변수 str은 새롭게 생성된 객체를 참조한다.
참조를 잃은 기존의 "Hello" 문자열 객체는 GC에 의해 Garbage로 간주되어 메모리에서 해제된다.
문자열 연산이 빈번하게 발생하는 상황이라면
그 만큼 많은 새로운 String 객체들이 생성되고,
참조를 잃은 Garbage들이 쌓이게 되므로 성능 저하 및 메모리 부족 현상이 발생할 수 있다.
따라서 불변성에 알맞게 읽기가 자주 발생하는 상황에서는 String 클래스가 적합하고
문자열 연산이 빈번하게 일어나는 상황에선 아래 가변성을 가지는 클래스를 사용하는 것이 더 적합하다.
StringBuilder, StringBuffer 클래스는 객체를 새로 생성하지 않고 동일 객체를 대상으로 문자열 연산을 할 수 있다.
2. StringBuilder, StringBuffer
먼저 StringBuilder와 StringBuffer 클래스의 차이는 동기화(synchronization) 처리의 유무다.
StringBuffer는 동기화된 메서드(synchronized)를 지원하여 멀티쓰레드 환경에서 안정성을 보장한다.
반면에 StringBuilder는 동기화 처리가 되어 있지 않기 때문에 단일쓰레드 환경에서의 성능은 StringBuffer보다 더 높다.
StringBuilder sb = new StringBuilder("Hello");
sb.append(" world");
System.out.println(sb); // Hello World
append() 메소드를 이용하여 문자열을 더했다.
StringBuilder와 StringBuffer는 '+' 등의 연산자를 사용할 수 없고 append()와 같은 메서드를 사용해서 조작해야 한다.
String 문자열도 객체이지만 + 연산자 사용이 가능한 이유는 특별한 예외 규칙이 존재하기 때문이다.
정리
String: 불변성, 일반적으로 사용, 문자열 풀, 읽기 위주 동작
StringBuilder: 가변성, 단일쓰레드 환경
StringBuffer: 가변성, 멀티쓰레드 환경
'Java' 카테고리의 다른 글
[Java] .equals("")와 .isEmpty()의 차이 (0) | 2022.08.01 |
---|---|
[Java] 자바 쓰레드 동기화(Synchronize) (0) | 2022.08.01 |
[Java] 문자열 비교와 문자열 풀(String Pool) (0) | 2022.07.31 |
[Java] 객체의 생성과 사용 (0) | 2022.07.31 |
[Java] 객체지향 언어의 특징 (0) | 2022.07.31 |