
Java 개발을 하다 보면 문자열을 많이 다루게 됩니다.
이 글에서는 String과 StringBuilder 클래스가 무엇인지, 왜 사용하는지, 어떻게 사용하는지, 그리고 둘 사이의 차이점을 알아보겠습니다.
Java에서 String 클래스는 문자열을 표현합니다. String 객체는 불변(immutable)이라는 중요한 특성을 가지고 있습니다. 이는 한 번 생성된 String 객체의 내용이 변경될 수 없다는 것을 의미합니다. String 객체의 내용을 변경하는 것처럼 보이는 모든 연산은 실제로 새로운 String 객체를 생성합니다.
String은 불변성으로 인해 코드가 간결하고 안전하며, 가독성이 높습니다. 문자열 상수와 표현식이 자주 사용되는 경우에 적합합니다. 불변성 덕분에 String 객체는 안전하게 공유될 수 있으며, 멀티스레드 환경에서도 안전합니다.
String greeting = "Hello";
String fullGreeting = greeting + ", World!";
System.out.println(fullGreeting);
// 출력: Hello, World!
위 예제에서 + 연산자는 greeting 문자열과 ", World!" 문자열을 결합하여 새로운 String 객체 fullGreeting을 생성합니다.
StringBuilder 클래스는 가변(mutable) 문자 시퀀스를 제공합니다. StringBuilder를 사용하면 문자열을 더 효율적으로 추가, 수정, 삭제할 수 있습니다. 내부적으로 가변적인 문자 배열을 사용하여 작업을 수행합니다.
문자열의 내용이 자주 변경되거나, 문자열 조작 작업이 많은 경우 StringBuilder를 사용하는 것이 좋습니다. StringBuilder는 내부 버퍼를 재활용하기 때문에 문자열 조작 시 성능이 향상됩니다. 이는 불필요한 객체 생성을 줄이고 메모리 사용을 최적화합니다.
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!");
System.out.println(sb.toString());
// 출력: Hello, World!
위 예제에서 append() 메소드는 기존 StringBuilder 객체 sb에 문자열을 추가합니다. 이 과정에서 새로운 객체를 생성하지 않습니다.

힙 메모리는 모든 Java 객체가 저장되는 곳입니다. String과 StringBuilder 객체 모두 여기에 할당됩니다. 힙 메모리는 가비지 컬렉터에 의해 관리되며, 더 이상 참조되지 않는 객체들은 메모리에서 제거됩니다.
String 객체는 힙 메모리에 생성됩니다.
String의 불변성 때문에, 문자열을 수정할 때마다 사실상 새로운 String 객체가 생성되고, 이전 객체는 가비지 컬렉션의 대상이 됩니다.
예를 들어, 문자열을 결합하는 작업은 기존 문자열을 변경하는 것이 아니라, 결합된 새 문자열을 담은 새 String 객체를 생성합니다.
StringBuilder도 힙 메모리에 생성되지만, 가변성을 가지고 있어 문자열을 추가하거나 변경할 때 내부적으로 배열을 조정하여 동일한 객체에서 문자열을 변경할 수 있습니다. 이로 인해 빈번한 문자열 조작이 필요한 경우 훨씬 더 효율적으로 작업을 수행할 수 있습니다.
String은 불변이며, StringBuilder는 가변입니다.StringBuilder가 String보다 성능이 우수합니다. String 연산은 새로운 객체를 생성하지만, StringBuilder는 내부 배열을 재사용합니다.String이 적합합니다. 복잡하거나 빈번한 문자열 조작이 필요한 경우에는 StringBuilder를 사용하는 것이 좋습니다.