String은 자바에서 가장 많이 쓰이는 클래스입니다. StringBuffer와 StringBuilder는 문자열을 조작하는 클래스입니다. 하지만, 자바를 처음 접하게 되었거나 혹은 자바를 사용하더라도 String, StringBuffer, StringBuilder에 대해서 헷갈리는 경우가 있습니다. 그래서 오늘은 이 클래스들의 차이점에 대해서 알아보도록 하겠습니다.
String
String의 가장 큰 특징은 불변이라는 점입니다. 변하지 않는다는 것은 쉽게 이해하지 못할 수 있습니다. 예를 들어 아래와 같은 코드가 있다고 가정해보도록 하겠습니다.
String a = "hello";
// or
String a = new String("hello");
a = "안녕하세요";
위의 코드를 보게 되면 변수 a의 값은 "hello"에서 "안녕하세요" 라고 변하는 것처럼 보여집니다. 하지만 a는 String 클래스가 아닌 String 클래스의 참조를 기억하기 위한 변수입니다.
위의 코드는 결국, "hello", "안녕하세요"라는 2개의 오브젝트를 만들게 되고, a는 오브젝트의 참조를 바꾸고 있는 것 뿐입니다. 이러한 점에서 String은 불변하다고 말할 수 있습니다.
StringBuffer
StringBuffer a = new StringBuffer("Hello");
1. 일부 수정 및 내용 추가
- StringBuffer는 주로 문자열의 특정 부분을 수정하거나 새로운 내용을 추가해야 하는 경우에 널리 사용됩니다.
- 이는 StringBuffer 클래스가 `insert()`와 `append()`와 같은 유용한 메서드를 제공하기 때문입니다.
2. String의 한계 극복
- String 클래스는 문자열에 내용을 추가할 때 새로운 String 객체를 생성하며, 기존 문자열은 변경되지 않습니다. 예를 들면 String 클래스의 변수를 추가하게 되면 변수의 값을 바꾸는 것이 아닌 다른 String 오브젝트를 만들어 추가하는 것 뿐입니다.
- 반면에 StringBuffer는 가변성을 가지며, 내부의 문자열을 직접 수정할 수 있기 때문에 효율적인 문자열 조작이 가능합니다.
3. insert() 및 append() 메서드
- StringBuffer의 강력한 기능 중 하나는 `insert()`와 `append()` 메서드입니다.
- `insert()`는 특정 위치에 문자열을 삽입할 수 있고, `append()`는 기존 문자열에 새로운 내용을 덧붙일 수 있습니다.
4. 문자열 독립적인 사이즈 컨트롤
- StringBuffer는 내용의 동적인 변경에 용이하게 설계되어 있어, 문자열의 크기를 독립적으로 조절할 수 있습니다.
- 이 특성은 대량의 텍스트를 다루거나 동적인 문자열 조작이 필요한 경우에 특히 효과적입니다.
5. 효율적인 메모리 관리
- StringBuffer는 내부적으로 가변적인 크기의 버퍼를 가지며, 문자열 조작 시에 효율적인 메모리 관리를 제공합니다.
- 이는 큰 텍스트 데이터를 다룰 때 성능 향상에 기여합니다.
6. Synchronized 지원
- StringBuffer는 여러 스레드가 동시에 접근하더라도 안전하게 작동하도록 synchronized(동기화)되어 있습니다.
- 따라서 멀티스레드 환경에서 안정적으로 사용할 수 있습니다.
7. 유연한 활용
- StringBuffer는 여러 가지 문자열 조작 작업을 지원하므로, 다양한 용도로 유연하게 활용할 수 있습니다.
- 특히 문자열 조작이 빈번한 작업에서 성능상의 이점을 제공합니다.
이러한 특성들로 인해 StringBuffer는 문자열 조작이 많이 필요한 상황에서 유용하게 활용되고 있습니다.
StringBuilder
tringBuilder a = new StringBuilder("Hello");
StirngBuilder 또한 StringBuffer와 비슷한 느낌으로 텍스트를 다루기 위해 사용하는 클래스라고 생각하시면 될 것 같습니다.
StringBuffer와 StringBuilder의 차이점
StringBuffer와 StringBuilder는 주로 문자열 조작에 사용되는데, 이 둘의 주요 차이 중 하나는 스레딩에 있습니다.
1. StringBuffer
StringBuffer는 멀티스레딩 환경에서 안전하게 사용할 수 있도록 설계되었습니다. 여러 스레드에서 동시에 같은 StringBuffer 인스턴스에 접근이 가능합니다. 또한, StringBuffer는 각 메서드가 동기화(synchronized)되어 있어 여러 스레드 간에 상호배제를 유지합니다. 멀티스레딩 환경에서 안전성이 중요한 상황에서 선택될 수 있습니다.
2. StringBuilder
StringBuilder는 싱글스레드 환경에서 사용될 것을 가정하고 만들어졌습니다. 멀티스레딩에서의 동기화 처리가 없기 때문에 단일 스레드 환경에서 더 효율적일 수 있습니다. StringBuilder는 동기화된 메서드를 사용하지 않기 때문에 여러 스레드 간의 동기화에 대한 부가적인 오버헤드가 없습니다. 단일 스레드 환경에서의 성능을 최적화하기 위해 선택될 수 있습니다.
오늘 배운 StringBuffer와 StringBuilder는 String과는 다른 클래스로, 특히 멀티스레드 환경에서의 안전성 여부에 따라 선택되어집니다. 이를 통해 다양한 문자열 조작 작업을 보다 효율적으로 수행할 수 있으며, 멀티스레딩에서의 안정성이 필요한 경우 StringBuffer, 단일 스레드에서의 더 나은 성능이 필요한 경우 StringBuilder를 선택할 수 있습니다.