Notice
Recent Posts
Recent Comments
Link
쯔이's Dev
String vs StringBuilder 본문
반응형
1️⃣ String vs StringBuilder 기본 개념
String | StringBuilder | |
가변성 (Mutability) | ❌ 불변(Immutable) | ✅ 가변(Mutable) |
메모리 사용 | 새로운 객체 생성 (낭비 多) | 같은 객체에서 변경 (효율적) |
속도 | 느림 (객체 재생성) | 빠름 (내부 배열 사용) |
사용 목적 | 문자열 변경이 거의 없을 때 | 문자열을 자주 수정할 때 |
2️⃣ String (불변 객체, Immutable)
* 특징
- String 객체는 한 번 생성되면 변경할 수 없음.
- 문자열을 수정하면 새로운 객체를 생성하고 기존 객체는 GC(Garbage Collector)가 제거함.
- 문자열 변경이 많을 경우 메모리 낭비가 발생할 수 있음
public class StringExample {
public static void main(String[] args) {
String str = "Hello";
str += " World"; // 새로운 객체가 생성됨
System.out.println(str);
}
}
✔️ 실행 과정
- "Hello" 객체가 생성됨.
- " World"를 추가하려면 새로운 "Hello World" 객체를 생성.
- 기존 "Hello"는 더 이상 사용되지 않지만 메모리에 남아 있음 (GC가 제거).
📌 출력
Hello World
✔️ 문제점: "Hello" → "Hello World"로 변경하는데 새로운 객체가 생성됨 → 메모리 낭비 발생 🚨
3️⃣ StringBuilder (가변 객체, Mutable)
📌 특징
- String과 다르게 한 번 생성된 객체를 수정 가능.
- 내부적으로 char[] 배열을 사용해 문자열을 저장.
- 문자열을 변경해도 새로운 객체를 생성하지 않고 기존 객체를 수정 → 메모리 효율적.
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 기존 객체에서 직접 수정 (객체 생성 X)
System.out.println(sb);
}
}
📌 출력
Hello World
4️⃣ 메서드 체이닝 (Method Chaining)
📌 메서드 체이닝이란?
- 여러 개의 메서드를 연속해서 호출하는 방식.
- 각 메서드가 자기 자신(this)을 반환하면 연속적으로 호출 가능.
📌 예제 (일반 방식 vs 체이닝)
1️⃣ 일반 방식
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.append("!");
System.out.println(sb);
✅ 출력: Hello World!
2️⃣ 메서드 체이닝 방식
StringBuilder sb = new StringBuilder("Hello")
.append(" World")
.append("!");
System.out.println(sb);
✅ 출력: Hello World!
✔️ 장점:
- 한 줄로 작성 가능 → 코드 가독성 향상
- sb.append()가 StringBuilder를 반환하기 때문에 연속 호출 가능
5️⃣ String과 StringBuilder 속도 비교
public class SpeedTest {
public static void main(String[] args) {
long startTime, endTime;
// String (느림)
startTime = System.nanoTime();
String str = "";
for (int i = 0; i < 10000; i++) {
str += "a"; // 새로운 객체 계속 생성 (비효율적)
}
endTime = System.nanoTime();
System.out.println("String 수행 시간: " + (endTime - startTime) + "ns");
// StringBuilder (빠름)
startTime = System.nanoTime();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("a"); // 기존 객체에서 수정 (효율적)
}
endTime = System.nanoTime();
System.out.println("StringBuilder 수행 시간: " + (endTime - startTime) + "ns");
}
}
✅ 출력 예시
String 수행 시간: 1023456789ns
StringBuilder 수행 시간: 12345678ns
✔️ 차이점: StringBuilder가 훨씬 빠름
6️⃣ 언제 String을 쓰고, 언제 StringBuilder를 쓸까?
상황 | String 사용 | StringBuilder 사용 |
문자열 변경 | 변경이 거의 없음 | 자주 변경 |
성능 고려 | 중요하지 않음 | 성능 최적화 필요 |
멀티스레드 환경 | String 사용 (Thread-Safe) | StringBuffer 사용 (동기화) |
7️⃣ 결론: String vs StringBuilder
String | StringBuilder | |
불변성(Immutable) | ✅ | ❌ |
가변성(Mutable) | ❌ | ✅ |
메모리 사용 | 비효율적 (새 객체 생성) | 효율적 (기존 객체 수정) |
속도 | 느림 | 빠름 |
사용 추천 | 변경이 거의 없는 경우 | 문자열을 자주 수정하는 경우 |
멀티스레드 지원 | 안전 (Immutable) | 안전하지 않음 |
🔥 최종 요약
✅ String은 불변(Immutable) → 변경할 때마다 새로운 객체 생성 (메모리 낭비)
✅ StringBuilder는 가변(Mutable) → 같은 객체에서 수정 가능 (빠르고 효율적)
✅ append()를 이용하면 문자열을 추가할 때 객체를 재사용하여 성능이 향상됨
✅ 메서드 체이닝(Method Chaining) 을 사용하면 코드를 간결하게 유지할 수 있음
📌 문자열 변경이 많다면 StringBuilder를 쓰는 것이 좋다! 🚀
728x90
반응형
'JAVA' 카테고리의 다른 글
containsKey(f)(equals, hashcode 오버라이딩) (0) | 2025.03.27 |
---|---|
StringTokenizer vs split() (1) | 2025.01.30 |
3-tier 아키텍처(service > dao > db) (2) | 2024.09.30 |