String, StringBuilder, StringBuffer
1. String, StringBuilder, StringBuffer
- String은 상수이며, 값을 만든 뒤 변경할 수 없다 (Immutable)
- String 클래스의 한계 (불변객체 > immutable)
> immutable(불변)한 특성으로 인해 문자열 변경시 메모리 낭비가 발생 (이전 문자열은 GC에 의해 제거)
> 문자열을 변경할 때마다 새로운 메모리가 할당됨
- StringBuffer와 StringBuilder는 String과는 다르게 변형 가능(mutable)하고, 내부적으로 배열의 형태로
선언되기 때문에 문자열 처리 후 새로운 인스턴스가 할당되는 것이 아닌 기존의 객체에 이어 붙인다.
따라서 훨씬 속도도 빠르고 공간의 낭비도 적다.
2. StringBuilder
- 문자열을 변경하거나 이어붙이는 경우 추가 메모리 생성없이 기존 문자열이 변경되는 클래스 (가변객체 > mutable)
- 멀티 쓰레드 환경에서 문자열의 안전한 변경을 보장해주지 않는다. (여러 쓰레드가 동시에 접근/변경하는 경우 수행결과가 올바르지 않음)
3. StringBuffer
- StringBuilder와 마찬가지로 문자열을 이어붙이는 경우 추가 메모리 생성없이 기존 문자열이 확장되는 클래스 (가변객체 > mutable)
- StringBuffer는 멀티쓰레드 환경에서 문자열의 안전한 변경을 보장한다. (두 쓰레드가 동시에 문자열에 접근하더라도 안전한 변경을 보장)
4. StringBuilder와 StringBuffer의 차이
- 동기화 : StringBuffer는 동기화 기능 지원, StringBuilder는 동기화 미지원이지만 단일 쓰레드에서는 StringBuffer보다 빠르다.
- 언제 어느걸 써야할까?
> StringBuilder : 싱글 쓰레드 환경에 적합, 스레드가 안전한 프로그램이거나 오류가 나도 큰 이슈가 없고 성능이 중요한 경우
> StrngBuffer : 멀티 쓰레드 환경에 적합, 연산이 많을 경우 유리
5. 성능 차이 (String vs StringBuilder vs StringBuffer)
- 3개의 성능을 비교해보면 StringBuilder > StringBuffer > String 순으로 StringBuilder가 제일 빠름
- 싱글 쓰레드인 경우 StringBuilder와 StringBuffer의 성능 차이 > StringBuilder가 연산속도가 빠르다
* 참고
- https://life-with-coding.tistory.com/485
- https://blog.neonkid.xyz/286