1. String
특징
- 불변(Immutable) 객체
- 한 번 생성된
String인스턴스의 내용은 변경할 수 없다. str += "a"처럼 보이는 연산도 사실은 새로운String객체를 만들어 참조를 바꾸는 것이다.
- 한 번 생성된
- final 클래스
String클래스는final이라 상속이 불가능하다.- 이는 불변성과 보안(예: 클래스 로딩, 파일 경로, 네트워크 주소 등에서의 오염 방지)에 도움을 준다.
- 값 타입처럼 동작하는 참조 타입
String참조 타입이지만,equals비교, 불변성 덕분에 값 타입처럼 사용하는 경우가 많다.==은 참조 비교,equals()는 내용 비교라는 점을 항상 구분해야 한다.
단점
자바의 String은 불변 객체라서, 내용 변경 시 변수에 저장된 값만 바뀌는 것이 아니다.
기존 문자열을 수정하는 대신, 변경된 내용을 가진 새로운 String 객체를 힙에 생성하고, 변수에는 그 새 객체의 참조값을 다시 대입하는 방식으로 동작한다.

2. StringBuilder, StringBuffer
특징
- 가변(Mutable) 객체
- String과 달리, 한 번 생성된 이후에도 내용을 변경할 수 있는 가변 객체이다.
append(),insert(),delete()등의 메서드를 통해 기존 객체 내부의 버퍼(메모리공간)를 수정하는 방식으로 동작한다.
- 성능 측면의 장점
- 문자열을 반복적으로 더하거나 수정해야 할 때, 매번 새로운 객체를 만들지 않고 같은 인스턴스의 내부 버퍼만 변경하므로 String보다 메모리·성능 면에서 유리하다.
- 루프 안에서
str += ...대신StringBuilder(또는StringBuffer)를 사용하는 것이 일반적으로 권장된다.
- 쓰레드 안전성 차이
StringBuilder는 동기화를 제공하지 않아 단일 쓰레드 환경에서 더 빠른 성능을 제공한다.StringBuffer는 메서드들이 동기화되어 있어 멀티쓰레드 환경에서 안전하지만 상대적으로 느릴 수 있다.
단점 및 주의점
- 가변 객체이기 때문에, 여러 곳에서 같은 인스턴스를 공유하면 예상치 못한 내용 변경(side effect) 이 발생할 수 있다.
- 외부에 노출되는 API에서는 가급적 결과를
String으로 반환하고, 내부 구현에서만StringBuilder/StringBuffer를 사용하는 것이 코드 안정성과 캡슐화 측면에서 더 좋다.

'Java' 카테고리의 다른 글
| [Java] 웹 서버와 WAS (0) | 2025.12.19 |
|---|---|
| [Java] CORS와 CSRF의 차이 (0) | 2025.12.14 |
| [Java] Framework, Library (0) | 2025.12.11 |
| [Java] Spring의 탄생 배경 (0) | 2025.12.11 |
| [Java] HashSet (0) | 2025.12.07 |