Java

[Java] String, StringBuffer, StringBuilder

Castle Bird 2025. 12. 12. 22:18

1. String

특징

  1. 불변(Immutable) 객체
    • 한 번 생성된 String인스턴스의 내용은 변경할 수 없다.
    • str += "a"처럼 보이는 연산도 사실은 새로운 String객체를 만들어 참조를 바꾸는 것이다.
  2. final 클래스
    • String 클래스는 final이라 상속이 불가능하다.
    • 이는 불변성과 보안(예: 클래스 로딩, 파일 경로, 네트워크 주소 등에서의 오염 방지)에 도움을 준다.
  3. 값 타입처럼 동작하는 참조 타입
    • String 참조 타입이지만, equals 비교, 불변성 덕분에 값 타입처럼 사용하는 경우가 많다.
    • ==은 참조 비교, equals()는 내용 비교라는 점을 항상 구분해야 한다.

단점
자바의 String불변 객체라서, 내용 변경 시 변수에 저장된 값만 바뀌는 것이 아니다.
기존 문자열을 수정하는 대신, 변경된 내용을 가진 새로운 String 객체를 힙에 생성하고, 변수에는 그 새 객체의 참조값을 다시 대입하는 방식으로 동작한다.

출처: 필자


2. StringBuilder, StringBuffer

특징

  1. 가변(Mutable) 객체
    • String과 달리, 한 번 생성된 이후에도 내용을 변경할 수 있는 가변 객체이다.
    • append(), insert(), delete() 등의 메서드를 통해 기존 객체 내부의 버퍼(메모리공간)를 수정하는 방식으로 동작한다.
  2. 성능 측면의 장점
    • 문자열을 반복적으로 더하거나 수정해야 할 때, 매번 새로운 객체를 만들지 않고 같은 인스턴스의 내부 버퍼만 변경하므로 String보다 메모리·성능 면에서 유리하다.
    • 루프 안에서 str += ... 대신 StringBuilder(또는 StringBuffer)를 사용하는 것이 일반적으로 권장된다.
  3. 쓰레드 안전성 차이
    • 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