자바에서 문자열을 다룰 때 많이 사용하는 클래스는 String, StringBuilder, StringBuffer이다. 이들 클래스는 각각의 용도와 특성이 다르며, 상황에 따라 적절하게 사용해야 한다.
String은 불변(Immutable) 객체이다. 즉, 문자열이 한 번 생성되면 변경할 수 없다. 따라서 문자열을 연결하거나 수정할 때는 항상 새로운 String 객체를 생성한다. 이로 인해 메모리 공간의 낭비가 발생하고 성능이 떨어질 수 있다.
예제:
public class StringExample {
public static void main(String[] args) {
String str = "Hello";
str = str + " World"; // 새로운 String 객체가 생성된다.
System.out.println(str); // Hello World
}
}
이 두 클래스는 String과 다르게 가변(Mutable) 객체이다. 따라서 문자열 연산 시 새롭게 객체를 생성하지 않고, 처음에 만든 객체를 이용해 연산하고 크기를 변경시켜 문자열을 변경한다. 이는 문자열 연산이 자주 발생하는 상황에서 성능적으로 유리하다.
public class StringBuilderBufferExample {
public static void main(String[] args) {
// StringBuilder 예제
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb.toString()); // Hello World
// StringBuffer 예제
StringBuffer sbf = new StringBuffer("Hello");
sbf.append(" World");
System.out.println(sbf.toString()); // Hello World
}
}
StringBuilder와 StringBuffer는 둘 다 문자열 연산 시 성능이 뛰어나지만, StringBuilder가 동기화를 지원하지 않기 때문에 약간 더 빠르다. 반면, StringBuffer는 동기화를 지원하기 때문에 멀티 쓰레드 환경에서 안전하게 사용할 수 있다.
String, StringBuilder, StringBuffer는 각각의 용도와 특성이 다르기 때문에 상황에 따라 적절하게 사용해야 한다. 문자열 연산이 적고 조회가 많은 경우에는 String을, 문자열 연산이 빈번한 싱글 쓰레드 환경에서는 StringBuilder를, 멀티 쓰레드 환경에서는 StringBuffer를 사용하는 것이 좋다.