자바에서 문자열을 다룰 때 String, StringBuffer, 그리고 StringBuilder 세 가지 주요 클래스가 사용됩니다. 각 클래스의 역할을 이해하고 장단점을 파악하여, 각각을 언제 사용해야 하는지를 정리해 보았습니다.
1. String
장점:
- 불변성: String 클래스의 인스턴스는 불변성을 가지고 있어, 생성 후에는 값을 변경할 수 없습니다.
- 보안성: 값을 변경할 수 없음으로 의도하지 않은 수정을 방지하여 보안을 향상합니다.
- 문자열 풀: 리터럴 문자열을 위한 문자열 풀을 유지하여 메모리 소비를 줄입니다.
단점:
- 비효율적인 수정: 자주 발생하는 문자열 연결 또는 수정은 많은 임시 객체의 생성으로 이어져 메모리 공간이 낭비되고 속도가 느려질 수 있습니다.
- 메모리 오버헤드: 각 수정 작업은 새로운 문자열 객체를 생성하므로 메모리 사용량이 증가합니다.
String을 사용하는 경우:
- 불변성이 중요한 경우
- 보안 및 스레드 안전이 필수인 경우
- 문자열 조작이 최소한인 경우
2. StringBuffer
장점:
- 가변성: StringBuffer 클래스의 인스턴스는 내용을 수정할 수 있어 자주 발생하는 문자열 조작에 적합합니다.
- 스레드 안전: StringBuffer 메서드는 동기화되어 있어 다중 스레드 환경에서 안전한 작업을 보장합니다.
단점:
- 성능 오버헤드: 동기화는 성능 비용을 동반하며, StringBuilder에 비해 단일 스레드 시나리오에서 효율적이지 않을 수 있습니다.
- 문자열 풀 미사용: String과 달리 StringBuffer는 리터럴 문자열을 위한 문자열 풀을 사용하지 않습니다.
StringBuffer를 사용하는 경우:
- 가변성이 필요한 경우
- 스레드 안전이 필요한 경우
- 다중 스레드 환경에서 자주 문자열을 수정해야 하는 경우
3. StringBuilder:
장점:
- 가변성: StringBuilder는 StringBuffer와 같이 Buffer(임시 메모리)에 문자열을 저장하기 때문에 문자열을 효율적으로 수정할 수 있습니다.
- 성능: StringBuilder는 동기화되지 않아 StringBuffer에 비해 단일 스레드 시나리오에서 더 나은 성능을 제공합니다.
단점:
- StringBuilder는 동기화가 없어 여러 스레드가 동시에 수정하는 경우에는 적합하지 않습니다.
- 문자열 풀 미사용: StringBuffer와 마찬가지로 StringBuilder도 리터럴 문자열을 위한 문자열 풀을 사용하지 않습니다.
StringBuilder를 사용하는 경우:
- 가변성이 필요한 경우
- 스레드 안전이 고려되지 않는 경우 (단일 스레드)
- 성능이 중요하며 동기화 오버헤드를 피하고자 하는 경우
과제 중 습관적으로 String만 사용하다가, 코드 리뷰를 받고, 수정이 필요한 상황에 안전한 StringBuffer를 알게 되었습니다.
'Java' 카테고리의 다른 글
| Stream (0) | 2024.01.12 |
|---|---|
| Map의 Value로 Class ? 𖦹 ˍ 𖦹 (0) | 2024.01.11 |
| 상속 (Inheritance) (0) | 2024.01.09 |
| 접근 제어자 (Access Modifier), Getter, Setter (0) | 2024.01.08 |
| List (0) | 2024.01.05 |