<aside>
💡 정리
- String 불변 객체, 멀티스레드 연산 많으면 오버헤드
- StringBuffer 가변 객체, 멀티스레드 연산 적으면 오버헤드
- StringBuilder 가변 객체, 싱글스레드 제일 빠름
</aside>

String
- 불변(immutable) 객체입니다. 한번 생성된 String 객체의 값은 변경할 수 없습니다.
- 새로운 문자열이 추가되면 기존 String 객체 대신 새로운 객체가 생성됩니다.
- 멀티스레드 환경에서 안전합니다.
- 문자열 연산이 많지 않은 경우에 적합합니다.
StringBuffer
- 가변(mutable) 객체입니다. 버퍼 내에서 문자열을 변경할 수 있습니다.
- 동기화(synchronized)되어 있어 멀티스레드 환경에서 안전합니다.
- 문자열 연산이 많은 경우 StringBuilder보다 느립니다
스프링에서 지역 변수로 StringBuilder 사용
이유
- 스레드 안전성: 지역 변수는 메서드 호출 시마다 새로 생성되며, 해당 메서드가 실행되는 동안에만 존재합니다. 따라서 다른 스레드와 공유되지 않으므로 스레드 안전성 문제가 발생하지 않습니다.
- 성능: StringBuilder는 동기화 오버헤드가 없기 때문에 StringBuffer보다 성능이 우수합니다. 따라서 단일 스레드 환경에서 문자열을 조작할 때 더 효율적입니다
@Service
public class MyService {
public String buildString() {
StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append("World!");
return sb.toString();
}
}
위 예시에서 **StringBuilder**는 메서드 내에서만 사용되므로 스레드 안전성 문제가 없습니다.
스프링에서 멤버 변수로 StringBuilder 사용
이유
- 스레드 안전성 문제: 멤버 변수는 여러 스레드에서 동시에 접근할 수 있으므로, StringBuilder를 멤버 변수로 사용하면 스레드 안전성 문제가 발생할 수 있습니다. 이 경우 StringBuffer를 사용하는 것이 안전합니다