[Java] String / StringBuffer / StringBuilder

bin·2025년 1월 19일
0

1. String

String 클래스는 불변(immutable) 클래스이다. 즉, String 객체는 한 번 생성되면 변경할 수 없다.

특징

  • 불변성: String 객체는 한 번 생성된 후 내용을 변경할 수 없다.
String
String str = "Hello";
str = str + " world";

System.out.println(str); // Hello world

위 코드를 보면 String의 값이 변경된 것처럼 보이지만 문자열 수정 시점에 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC(Garbage Collection, 가비지 컬렉션)에 의해 사라지고, 새 메모리 영역을 참조한다.
즉, 문자열을 추가하면 실제로는 새로운 String 객체가 생성되고, 기존의 String 객체는 변경되지 않는다.

  • 성능: 문자열을 자주 수정하는 경우, String은 비효율적이다. 새로운 문자열을 생성하는 방식으로 동작하기 때문에 메모리와 시간이 추가적으로 소모된다.
  • 쓰레드 안전(Thread-safe): String은 불변 객체이므로 다중 스레드 환경에서 안전하게 사용할 수 있다.

2. StringBuffer

StringBuffer 클래스는 가변(mutable) 문자열을 다루는 클래스이다. 내부적으로 문자열을 수정할 수 있도록 설계되어 있으며, 스레드 안전(Thread-safe) 하도록 동기화(synchronized) 기능을 제공한다.

특징

  • 가변성: StringBuffer는 문자열을 수정할 수 있다. 예를 들어, 문자열에 문자를 추가하거나 변경할 수 있다.
  • 성능: StringBuffer는 String보다 성능이 좋다. 문자열을 수정할 때마다 새로운 객체를 생성하지 않고 내부의 버퍼에서 직접 수정한다.
  • 동기화: StringBuffer는 메서드가 동기화되어 있어 멀티스레드 환경에서 안전하게 사용할 수 있다. 그러나 동기화가 추가적인 비용을 발생시켜 성능이 떨어질 수 있다.
  • 쓰레드 안전(Thread-safe): 여러 스레드에서 동시에 접근해도 안전하게 사용할 수 있다. 그러나 이로 인해 성능 저하가 발생할 수 있다.

3. StringBuilder

StringBuilder 클래스는 StringBuffer와 매우 유사하지만 스레드 안전성이 없는 가변 문자열 클래스이다. 즉, 멀티스레드 환경에서는 사용하는 것을 지양해야 한다.

특징

  • 가변성: StringBuilder는 문자열을 변경할 수 있다. String보다 성능이 좋고, StringBuffer보다 빠르다.
  • 성능: StringBuilder는 동기화가 없기 때문에 StringBuffer보다 성능이 뛰어나다. 문자열을 자주 수정할 때 성능상의 장점이 있다.
  • 쓰레드 안전(Thread-safe 아님): StringBuilder는 멀티스레드 환경에서 안전하지 않다. 따라서, 하나의 스레드에서만 사용하거나 동기화가 필요 없는 경우에만 적합하다.

요약

String은 불변 객체이므로 문자열이 자주 수정되지 않는 경우에 적합하다. 불변성 덕분에 멀티스레드 환경에서 안전하게 사용할 수 있다.
StringBuffer는 가변 객체로, 멀티스레드 환경에서 안전하게 문자열을 수정할 수 있지만 동기화로 인한 성능 저하가 있을 수 있다.
StringBuilder는 StringBuffer와 비슷하지만 동기화가 없어서 성능이 더 좋다. 그러나 멀티스레드 환경에서는 안전하지 않으므로, 단일 스레드 환경에서만 사용해야 한다.

따라서, 문자열을 자주 변경해야 할 경우 StringBuilder를 사용하는 것이 일반적으로 가장 효율적이며, 멀티스레드 환경에서 안전성을 보장하려면 StringBuffer를 사용하고, 문자열이 변하지 않거나 변경이 적은 경우에는 String을 사용하는 것이 적합하다.

0개의 댓글