String vs StringBuilder vs StringBuffer
- 프로그래밍 언어/자바
- 2025. 2. 7. 21:56
반응형
반응형
String vs new String()
1. String은 불변(Immutable) 객체
- String은 한 번 생성되면 변경할 수 없는 불변 객체임.
- + 연산을 하면 기존 객체를 수정하는 것이 아니라 새로운 String 객체가 생성됨.
- 따라서 여러 번 + 연산을 수행하면 힙 메모리에 많은 객체가 생성되어 성능 저하가 발생할 수 있음.
2. 문자열 초기화 방법 (2가지)
- 리터럴(" 사용) 초기화
- String Pool(힙 메모리의 일부)에 저장됨.
- 동일한 문자열이 존재하면 기존 객체를 재사용하여 메모리를 절약함.
- String str1 = "hello";
- new 연산자 사용한 초기화
- Heap 메모리에 새로운 객체가 생성됨.
- 같은 문자열이라도 매번 새로운 객체를 생성하여 메모리 낭비가 발생할 수 있음.
- String str2 = new String("hello");
3. 두 방식의 차이점
String str1 = "hello";
String str2 = "hello"; // str1과 동일한 객체 참조 (String Pool)
String str3 = new String("hello"); // 새로운 객체 생성 (Heap)
- 리터럴 초기화: 같은 문자열이 있으면 기존 객체를 참조하여 메모리를 절약.
- new 연산자 초기화: 같은 문자열이어도 새로운 객체를 생성하여 메모리를 더 사용함.
4. 결론
- 메모리 절약을 위해 String을 리터럴 방식으로 초기화하는 것이 권장됨.
- 문자열 연산이 많다면 StringBuilder 또는 StringBuffer를 사용하여 불필요한 객체 생성을 방지하는 것이 좋음.
1. 공통점
- StringBuilder와 StringBuffer는 가변(Mutable) 객체로, 문자열 변경 시 기존 객체를 유지하면서 내부 버퍼를 수정하기 때문에 연산 속도가 훨씬 빠름.
- + 연산을 수행할 때:
- String: 연산할 때마다 새로운 객체가 생성됨 → 메모리 낭비 발생
- StringBuilder/StringBuffer: 내부 버퍼를 수정하여 단 하나의 객체만 유지
2. 차이점 (Thread-safe 여부)
클래스 Thread-safe 여부 특징
StringBuilder | ❌ (Thread-safe하지 않음) | 단일 스레드 환경에서 빠른 성능 제공 |
StringBuffer | ✅ (Thread-safe, synchronized 사용) | 멀티 스레드 환경에서 안전하지만 성능이 상대적으로 느릴 수 있음 |
3. 사용 선택 기준
- 문자열 변경이 적으면 → String (불변 객체)
- 단일 스레드 환경 → StringBuilder (더 빠른 성능)
- 멀티 스레드 환경 → StringBuffer (Thread-safe 보장, 하지만 불필요한 동기화는 성능 저하 원인이 될 수도 있음)
- 대신, 멀티 스레드 환경에서도 StringBuilder + synchronized 블록을 활용하면 성능을 최적화할 수도 있음.
✅ 최종 결론
- 일반적인 경우: StringBuilder가 가장 적합
- 멀티 스레드 환경: StringBuffer가 안전하지만, 성능이 중요하다면 StringBuilder + synchronized 고려
- String은 불변 객체이므로 변경이 거의 없을 때만 사용하는 것이 좋음! 🚀
반응형