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
를 사용하는 것이 좋습니다.