
문자열을 다루는 클래스는 String만 있는 줄 알았는데, 코테 연습을 시작하면서 StringBuilder 와 StringBuffer라는 클래스도 있다는 걸 알게 되었다.
내가 쉽게 기억하기 위해서 간단히 정리해보는 시간.
String: 불변 속성. 문자열 연산 발생시 매번 인스턴스를 생성해야하므로 비효율적인 메모리차지가 있다. 불변 속성으로 인해 thread-safe하다.
StringBuilder, StringBuffer: 가변 속성. 문자열 연산시 버퍼의 크기를 늘리며 유연하게 대처 가능.
thread-safe하느냐 아니냐의 차이.
StringBuilder: 멀티쓰레드 환경에 안전하지 않지만 단일 쓰레드에서는 StringBuffer보다 성능이 좋다.
StringBuffer: 동기화를 지원하여 멀티쓰레드 환경에 안전하다.
String 외에 두 클래스를 사용하는 이유는, 문자열 합치기를 시도하면 매번 새로운 객체를 생성하는 비효율성 때문이다. 하지만 JAVA 1.8 이후 + 연산을 통한 문자열 합치기를 하면 StringBuilder로 자동 치환되어 성능 최적화가 이루어진다고 한다. 단, 특정 경우에 한해서!
- String으로 + 연산을 사용 하거나 (자동치환 ⭕️)
String str = "0" + "1" + "2";
- String의 concat() 메서드를 사용하거나 (자동치환 ❌)
String str = "" .concat("0") .concat("1") .concat("2");
- 반복문 안에서 선언한 경우 (자동치환 ❌)
String str = "" for(int i = 0; i < 10; i++) { str += i; }
2,3과 같은 경우는 성능 최적화가 이루어지지 않는다.
2의 경우는 한 줄로 선언하더라도 StringBuilder로 치환되지 않으며 성능 저하가 발생한다.
3의 경우는 StringBuilder로 치환되지만 반복 수행시마다 새로운 인스턴스를 생성하므로 성능 저하가 발생한다.
1의 경우는 한 줄로 StringBuilder로 치환되지 않지만 한줄처리되어 하나의 인스턴스로만 생성되므로 StringBuilder를 사용할 필요가 없다.
결론: 문자열을 +연산으로 한 줄로 처리할 경우에는 String을 써도 무방하다.