본문 바로가기
프로그래밍/Back-end

Java 스트링(String) 스트링버퍼(StringBuffer) 스트링빌더(StringBuillder)에 대해서!

by @GodWin 2024. 10. 10.

-




-
안녕하세요? 오늘은, Java의 문자열 클래스인 스트링(String), 스트링버퍼(String Buffer), 스트링빌더(String Builder)에 대해서 알아보려 합니다.
 

셋 다 JAVA 문자열 클래스의 일종이지만, immutable ↔ mutable 차이가 있습니다.
그럼, 각각에 대해서 알아볼까요?



스트링 (String)
: 불변성(Immutable)
: 한 번 생성된 문자열은 변경할 수 없습니다. 문자열을 변경하려고 하면 새로운 문자열 객체가 생성됩니다.
: 한 번 생성되면, 할당된 메모리 공간이 변하지 않습니다. (주소값이 Stack 메모리 영역에 쌓이고, 클래스들은 Heap 메모리 영역에 생성)
: 기존에 생성된 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열이 붙는 것이 아니라, 새로운 스트링 객체를 만든 후, 새 스트링 객체에 연결된 문자열을 저장하고. 그 객체를 참조하도록 합니다.
: 기존 객체가 제거되면 JAVA의 가비지 컬렉션이 회수를 합니다.
: 문자열 연결 연산이 많을 경우, 매번 새로운 객체가 생성되기 때문에 성능 저하가 발생할 수 있습니다.
: 불변 문자열이 필요할 때, 또는 문자열이 자주 변경되지 않을 때 사용합니다.
: 동기화에 대해 신경 쓸 필요가 없습니다. -> 내부 데이터 자유롭게 공유가 가능합니다.


스트링버퍼(String Buffer)
: 가변성(Mutable)
: 객체의 내용을 변경할 수 있습니다. 문자열을 추가하거나 수정해도 동일한 객체를 유지합니다.
: 여러 스레드가 동시에 접근해도 안전하게 사용할 수 있도록 synchronized 메서드를 제공합니다.
: 각 메서드 별로 싱크로나이즈 키워드가 존재합니다.
-> 멀티스레드 환경에서도 동기화를 지원
-> 멀티스레드 환경에서 활용
: Memory에 append 하는 방식으로 클래스를 직접 생성하지 않음
: 여러 번 문자열을 변경할 필요가 있을 때, 그리고 스레드 안전이 필요할 때 사용합니다. (비동기 동작 시에 적합)


스트링빌더(String Builder)
: 가변성(Mutable)
: StringBuffer와 마찬가지로 객체의 내용을 변경할 수 있습니다.
: 성능을 위해 스레드 안전성을 제공하지 않습니다. 단일 스레드 환경에서 더 빠르게 동작합니다.
: 멀티스레드 환경이 아닐 때, 성능이 중요한 경우에 사용합니다.
: 동기화를 보장하지 않습니다.
-> 단일스레드 환경에서 활용
: Memory에 append 하는 방식으로 클래스를 직접 생성하지 않습니다.


단순한 성능만 놓고 본다면, 연산이 많을 경우에는 [ StringBuilder를 > StringBuffer > String ] 이지만, 각자의 환경과 사용편의성등을 고려하여 적시적소에 활용을 하는게 적절합니다.
문자열을 많이 수정해야 한다면 여전히 StringBuilder를 사용하는 것이 좋습니다. 
String과 StringBuilder의 성능 차이는 코드의 구조와 사용 방식에 따라 달라질 수 있습니다.



※ 참고
- JDK 1.5 이전 버전
: String 객체는 불변 객체로, 문자열을 여러 번 수정할 경우 새로운 객체가 생성됩니다. 따라서 문자열을 자주 변경하는 경우 성능 저하가 발생했습니다.
: StringBuffer 사용: 이 시기에는 가변 문자열 처리를 위해 StringBuffer가 주로 사용되었습니다.

- JDK 1.5 이후 버전
: JDK 1.5에서 StringBuilder가 추가되었고, 성능 측면에서 StringBuffer보다 더 나은 성능을 제공했습니다. 이는 StringBuilder가 스레드 안전성을 제공하지 않기 때문입니다.
: 이후 String과 StringBuilder 간의 성능 차이가 거의 없다는 주장은 특정 상황에서의 최적화나 JIT(Just-In-Time) 컴파일러의 영향을 받을 수 있지만, 기본적으로는 여전히 String을 많이 수정할 경우 StringBuilder를 사용하는 것이 성능상 유리합니다. String은 불변이기 때문에, 수많은 변경이 필요할 경우 새 객체가 계속 생성됩니다.



오늘은, Java의 문자열 클래스인 스트링(String), 스트링버퍼(String Buffer), 스트링빌더(String Builder)에 대해서 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길 바라곘습니다.