문자열 합치기

bada·2024년 4월 1일

Java

목록 보기
1/4
post-thumbnail

문자열을 다루는 클래스는 String만 있는 줄 알았는데, 코테 연습을 시작하면서 StringBuilder 와 StringBuffer라는 클래스도 있다는 걸 알게 되었다.

내가 쉽게 기억하기 위해서 간단히 정리해보는 시간.

1. String과 StringBuilder, StringBuffer의 차이

String: 불변 속성. 문자열 연산 발생시 매번 인스턴스를 생성해야하므로 비효율적인 메모리차지가 있다. 불변 속성으로 인해 thread-safe하다.
StringBuilder, StringBuffer: 가변 속성. 문자열 연산시 버퍼의 크기를 늘리며 유연하게 대처 가능.


2. StringBuilder와 StringBuffer의 차이

thread-safe하느냐 아니냐의 차이.
StringBuilder: 멀티쓰레드 환경에 안전하지 않지만 단일 쓰레드에서는 StringBuffer보다 성능이 좋다.
StringBuffer: 동기화를 지원하여 멀티쓰레드 환경에 안전하다.

String 외에 두 클래스를 사용하는 이유는, 문자열 합치기를 시도하면 매번 새로운 객체를 생성하는 비효율성 때문이다. 하지만 JAVA 1.8 이후 + 연산을 통한 문자열 합치기를 하면 StringBuilder로 자동 치환되어 성능 최적화가 이루어진다고 한다. 단, 특정 경우에 한해서!


3. StringBuilder로의 자동치환은 + 연산을 한 줄로 선언하는 경우에만.

  1. String으로 + 연산을 사용 하거나 (자동치환 ⭕️)
String str = "0" + "1" + "2";
  1. String의 concat() 메서드를 사용하거나 (자동치환 ❌)
String str = ""
            .concat("0")
            .concat("1")
            .concat("2");
  1. 반복문 안에서 선언한 경우 (자동치환 ❌)
String str = ""
for(int i = 0; i < 10; i++) {
	str += i;
}

2,3과 같은 경우는 성능 최적화가 이루어지지 않는다.
2의 경우는 한 줄로 선언하더라도 StringBuilder로 치환되지 않으며 성능 저하가 발생한다.
3의 경우는 StringBuilder로 치환되지만 반복 수행시마다 새로운 인스턴스를 생성하므로 성능 저하가 발생한다.

1의 경우는 한 줄로 StringBuilder로 치환되지 않지만 한줄처리되어 하나의 인스턴스로만 생성되므로 StringBuilder를 사용할 필요가 없다.


결론: 문자열을 +연산으로 한 줄로 처리할 경우에는 String을 써도 무방하다.

profile
하루 세번 목 당기기

0개의 댓글