자바에서 문자열을 다루는 클래스인 String, StringBuilder, StringBuffer에 대해서 알아보자.
String
우리가 흔히 알고 있는 문자열을 다룰 때 사용하는 기본적인 클래스이다.
String도 concat이나 +로 문자열 연산 가능하지만 + 사용해서 String 인스턴스 결합 시에 기존 String 인스턴스에 내용을 추가하는 것이 아니라 내용이 합쳐진 새로운 String 인스턴스를 생성하기 때문에 결합을 많이 할수록 공간 낭비, 시간 낭비이다.
StringBuffer & StringBuilder
그래서 나온 문자열 연산 전용 클래스가 StringBuffer와 StringBuilder이다.
StringBuffer의 특징은 내부적으로 Buffer라는 공간을 가지기 때문에 문자열 추가가 바로 가능하다는 점이다. Buffer 덕분에 속도, 공간 낭비가 없으며 데이터 연산 속도도 굉장히 빠르다는 장점이 있다.
기본적으로 StringBuffer의 문자열 저장이 가능한 Buffer의 크기는 16이며, 생성자를 통해 지정해 줄 수도 있다. 넘어도 자동으로 늘려주기 때문에 상관은 없지만 효율이 떨어지기 때문에 넉넉하게 정해주는 게 좋다.
String과 StringBuffer / StringBuilder의 차이
String은 불변(immutable) / StringBuilder와 StringBuffer는 가변(mutable)이다. String 인스턴스를 생성하면 변수의 타입이 final 이기 때문에 변경이 불가능하다. 따라서 우리가 + 연산자로 데이터를 업데이트 하는 것처럼 보이는 것은 기존 데이터 a에 새로운 데이터 b를 합치는 것이 아니라 a+b를 합친 새로운 데이터를 생성하는 것이다.
StringBuffer는 가변적인 성질을 가지기 때문에 문자열 연산 시에 새로운 인스턴스를 생성하지 않는다. 반대로 기존의 데이터에 .append(), .delete() 메서드를 이용하여 데이터를 조작한다.
StringBuilder vs StringBuffer
두 클래스 모두 가변적이고 제공되는 메서드 또한 완전히 같다는 공통점이 있다. 한 가지 차이점은 바로 멀티스레드 환경에서 안전한가 차이점이다.
StringBuffer는 동기화를 지원하는 반면, StringBuilder는 동기화를 지원하지 않는다. 동기화(Synchronization)를 지원하지 않는 점 때문에 멀티스레드 환경에서의 StringBuilder는 스레드들이 동시에 객체에 접근하여 연산을 수행할 경우, 연산이 수행되지 않아 원하는 결과가 나오지 않을 수도 있다.
속도 비교
두 객체의 성능을 비교해본다면 당연하게도 동기화를 지원하지 않는 StringBuilder가 더욱 우세하다. StringBuffer의 동기화(Synchronization)에서는 스레드가 객체를 점유하고 있는 동안에는 다른 스레드가 객체에 접근하지 못하도록 한다. 그렇기 때문에 스레드의 객체 점유가 끝난 후에야 다른 객체가 접근할 수 있다. 따라서 StringBuilder가 성능 측면에서는 조금 더 우세한 것이다.
싱글 스레드 환경이나, 비동기를 할 예정이 없다면 StringBuilder를, 멀티 스레드 환경에서는 StringBuffer를 사용하는 것이 바람직하다.
Reference
☕ 자바 String / StringBuffer / StringBuilder 차이점 & 성능 비교
자바에서는 대표적으로 문자열을 다루는 자료형 클래스로 String, StringBuffer, StringBuilder 라는 3가지 자료형을 지원한다. 위 3가지 클래스 자료형은 모두 문자열을 다루는데 있어 공통적으로 사용되
inpa.tistory.com
https://gyoogle.dev/blog/computer-language/Java/String%20&%20StringBuilder%20&%20StringBuffer.html
[Java] 문자열 클래스 | 👨🏻💻 Tech Interview
[Java] 문자열 클래스 분류 String StringBuffer StringBuilder 변경 Immutable Mutable Mutable 동기화 Synchronized 가능 (Thread-safe) Synchronized 불가능. 1. String 특징 new 연산을 통해 생성된 인스턴스의 메모리 공간은 변
gyoogle.dev
https://madplay.github.io/post/difference-between-string-stringbuilder-and-stringbuffer-in-java
자바 String, StringBuilder 그리고 StringBuffer 성능 차이 비교
자바에서 String과 StringBuilder 그리고 StringBuffer의 차이는 무엇일까? 그리고 제일 빠른 연산 속도는 어떤 것일까?
madplay.github.io
'Java' 카테고리의 다른 글
[Java] Casting(캐스팅) (0) | 2024.04.05 |
---|---|
[Java] Error & Exception(에러와 예외 클래스) (0) | 2024.04.04 |
[Java] 직렬화(Serialization) (0) | 2024.01.31 |
[Java] 오토박싱(Autoboxing) & 오토 언박싱(Autounboxing) (0) | 2024.01.25 |
[Java] Primitive Type & Reference Type (0) | 2024.01.25 |