Table of Contents
자바의 String과 StringBuilder
1. 개요
자바에서 문자열을 다루는 대표적인 클래스는 String
과 StringBuilder
입니다.
두 클래스는 문자열을 처리하는 방식이 다르며, 이에 따라 성능과 사용 방법에도 차이가 있습니다.
2. String 클래스
2.1 String의 특징
String
은 불변(Immutable) 객체입니다.- 문자열 연산(추가, 변경 등)을 수행하면 새로운
String
객체가 생성됩니다. String
객체는 리터럴 풀(String Pool)을 사용하여 메모리 효율을 높입니다.
2.2 String 사용 예제
public class StringExample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true (같은 String Pool 참조)
System.out.println(str1 == str3); // false (Heap 메모리에 별도 객체 생성)
}
}
2.3 String의 불변성 문제
문자열을 자주 변경해야 할 경우, String
을 사용하면 매번 새로운 객체가 생성되어 메모리 낭비와 성능 저하가 발생할 수 있습니다.
String str = "Java";
str += " is";
str += " awesome!";
System.out.println(str);
// 매번 새로운 String 객체가 생성됨
3. StringBuilder 클래스
3.1 StringBuilder의 특징
StringBuilder
는 가변(Mutable) 객체로 문자열을 직접 수정할 수 있습니다.String
과 달리 새로운 객체를 생성하지 않고 내부 버퍼를 사용하여 문자열을 변경합니다.- 성능이 중요한 경우(
+
연산을 많이 사용하는 경우)StringBuilder
를 추천합니다.
3.2 StringBuilder 사용 예제
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Java");
sb.append(" is");
sb.append(" awesome!");
System.out.println(sb.toString());
// 내부 버퍼를 사용하여 성능 향상
}
}
3.3 주요 메서드
메서드 | 설명 |
---|---|
append(String s) |
문자열 추가 |
insert(int offset, String s) |
특정 위치에 문자열 삽입 |
replace(int start, int end, String s) |
문자열 교체 |
delete(int start, int end) |
특정 구간의 문자열 삭제 |
reverse() |
문자열 뒤집기 |
4. String vs StringBuilder 성능 비교
public class PerformanceTest {
public static void main(String[] args) {
long startTime, endTime;
// String 성능 테스트
startTime = System.nanoTime();
String str = "";
for (int i = 0; i < 10000; i++) {
str += i;
}
endTime = System.nanoTime();
System.out.println("String Time: " + (endTime - startTime) + " ns");
// StringBuilder 성능 테스트
startTime = System.nanoTime();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
endTime = System.nanoTime();
System.out.println("StringBuilder Time: " + (endTime - startTime) + " ns");
}
}
실행 결과 (예시)
String Time: 123456789 ns
StringBuilder Time: 1234567 ns
StringBuilder
가String
보다 훨씬 빠르게 동작함을 확인할 수 있습니다.
5. 결론
특징 | String | StringBuilder |
---|---|---|
가변성 | 불변(Immutable) | 가변(Mutable) |
속도 | 느림 (새로운 객체 생성) | 빠름 (내부 버퍼 사용) |
멀티스레드 환경 | 안전 (불변 객체) | 안전하지 않음 (synchronized 없음) |
메모리 사용 | 상대적으로 많음 | 상대적으로 적음 |
- 문자열 변경이 적을 경우 →
String
사용 - 문자열 변경이 많을 경우 →
StringBuilder
사용 (멀티스레드 환경에서는StringBuffer
고려)
이제 String
과 StringBuilder
의 차이를 이해하고, 적절한 상황에서 선택하여 사용해보세요! 🚀