Java에서 문자열을 다룰 때 `String`과 `StringBuilder`는 자주 사용됩니다. 두 클래스는 모두 문자열을 처리하지만, 성능과 동작 방식에서 중요한 차이점이 존재합니다. 이 글에서는 `String`과 `StringBuilder`의 차이점에 대해 설명합니다.
1. String 클래스
String은 불변(immutable) 클래스입니다. 즉, 한 번 생성된 문자열은 수정할 수 없습니다. 문자열을 수정하려고 할 경우, 새로운 String 객체가 생성되고, 기존의 객체는 변경되지 않습니다. 이로 인해 성능상 불필요한 객체 생성이 발생할 수 있습니다.
String 예시
public class StringExample { public static void main(String[] args) { String str = "Hello"; str = str + " World"; // 문자열 연결 시 새로운 String 객체가 생성됩니다. System.out.println(str); } }
2. StringBuilder 클래스
StringBuilder는 가변(mutable) 클래스입니다. 즉, 문자열을 수정하는 데 있어 새로운 객체를 생성하지 않고 기존 객체의 값을 변경합니다. 이로 인해 문자열을 여러 번 수정할 때 `String`보다 성능이 뛰어납니다. 주로 반복문에서 문자열을 추가하거나 변경할 때 유용합니다.
StringBuilder 예시
public class StringBuilderExample { public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 기존 StringBuilder 객체의 값을 변경 System.out.println(sb.toString()); } }
3. 성능 차이
`String`은 불변 객체이기 때문에 문자열을 수정할 때마다 새로운 객체가 생성되며, 이로 인해 메모리 사용량과 성능이 떨어질 수 있습니다. 반면, `StringBuilder`는 가변 객체로, 기존 객체를 수정하므로 성능상 유리합니다.
성능 비교 예시
반복문을 이용한 문자열 연결에서 `String`과 `StringBuilder`의 성능 차이를 비교해 보겠습니다. 아래는 두 방법을 비교하는 코드입니다.
public class PerformanceComparison { public static void main(String[] args) { // String을 사용한 문자열 연결 String str = ""; for (int i = 0; i < 1000; i++) { str += "Hello"; // 매번 새로운 String 객체가 생성됩니다. } // StringBuilder를 사용한 문자열 연결 StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append("Hello"); // 기존 StringBuilder 객체의 값을 변경합니다. } System.out.println("String 연결 완료"); System.out.println("StringBuilder 연결 완료"); } }
4. 주요 차이점 요약
특징 | String | StringBuilder |
---|---|---|
불변성 | 불변(immutable) | 가변(mutable) |
성능 | 여러 번 수정 시 성능 저하 | 여러 번 수정 시 성능 우수 |
메모리 사용 | 수정 시 새로운 객체 생성 | 기존 객체를 수정 |
주 사용 용도 | 불변 문자열을 다룰 때 | 여러 번 문자열을 수정할 때 |
5. 결론
Java에서 문자열을 다룰 때, 문자열을 수정하는 방식에 따라 `String`과 `StringBuilder`를 선택해야 합니다. 만약 문자열을 자주 수정해야 한다면 `StringBuilder`를 사용하는 것이 성능 면에서 유리합니다. 반면, 문자열이 변경되지 않거나 한 번만 수정되면 `String`을 사용하는 것이 더 간편합니다.