Java에서 문자열을 다룰 때 사용하는 대표적인 클래스들은 String
, StringBuffer
, StringBuilder
가 있습니다. 이 세 클래스는 각각의 특징이 있으며, 사용되는 환경이나 요구사항에 따라 선택됩니다.
분류 | String | StringBuffer | StringBuilder |
---|---|---|---|
변경 가능 여부 | Immutable | Mutable | Mutable |
동기화 지원 | 동기화 불필요 | 동기화 가능 (Thread-safe) | 동기화 불가능 |
String
객체는 한 번 생성되면 변경할 수 없습니다. 즉, 문자열이 변경될 때마다 새로운 객체가 생성됩니다.public class StringExample {
public static void main(String[] args) {
String str = "Hello";
str += " World"; // 새로운 객체 생성
System.out.println(str); // "Hello World"
}
}
• Mutable (가변성): StringBuffer와 StringBuilder는 문자열을 수정할 때 새로운 객체를 생성하지 않고 기존 객체를 수정합니다.
• 성능 최적화: 문자열이 자주 변경되는 경우, 두 클래스는 새로운 객체 생성을 방지하여 성능을 높입니다.
• 메서드 동일: 두 클래스는 메서드 구성이 거의 동일합니다. 다만, 동기화 여부에 차이가 있습니다.
• StringBuffer
• Thread-safe: StringBuffer는 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
• 적합한 환경: 문자열 연산이 많고, 멀티스레드 환경에서 동기화가 필요한 경우에 적합합니다.
• StringBuilder
• Thread-safe하지 않음: StringBuilder는 동기화를 지원하지 않으므로 멀티스레드 환경에서는 안전하지 않습니다.
• 적합한 환경: 문자열 연산이 많은 싱글 스레드 환경이나 동기화를 고려하지 않는 경우에 적합합니다.
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 기존 객체에 문자열 추가
System.out.println(sb.toString()); // "Hello World"
}
}
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 기존 객체에 문자열 추가
System.out.println(sb.toString()); // "Hello World"
}
}
• String은 불변 객체로 멀티스레드 환경에서 안전하게 사용할 수 있으며, 문자열 변경이 적고 조회가 많은 경우에 적합합니다.
• StringBuffer는 가변 객체로, 문자열을 자주 변경해야 하고 동기화가 필요한 멀티스레드 환경에서 사용됩니다.
• StringBuilder는 동기화를 고려하지 않아도 되는 싱글 스레드 환경에서 문자열을 자주 변경해야 할 때 적합합니다.
따라서, 상황에 맞는 문자열 클래스를 선택함으로써 성능과 안정성을 모두 고려하는 것이 중요합니다.