[CS] String, StringBuffer, StringBuilder 차이·장단점

Jisu Nam·2022년 12월 21일
0

CS

목록 보기
1/1

참고 : https://ifuwanna.tistory.com/221

1. 개념

  • String, StringBuffer, StringBuilder : Java에서 [문자열]을 다루는 대표적인 클래스
  • 연산 횟수가 많아지거나 멀티스레드, 경쟁 상태(Race Condition)등의 상황이 자주 발생하면 각 상황에 따라 그 특징에 맞는 적절한 클래스를 사용해야 한다.
  • String : 불변(Immutable),
    StringBuffer, StringBuilder : 가변(Mutable)

2. String

  • Stirng은 한번 객체가 생성되면 할당된 메모리 공간이 변하지 않음.
  • concat 메서드 혹은 연산자를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도
    기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만든 후 새 String 객체에 연결된 문자열을 저장하고 그 객체를 참조하도록 함.
    => String 클래스는 Heap 메모리 영역 (가비지 컬렉션이 동작하는 영역)에 생성하고, 한 번 생성된 객체의 내부 내용을 변화시킬 수 없음. (기존 객체가 제거되면 Java의 가비지 컬렉션이 회수됨.)

    위처럼 문자열을 단순히 읽는 경우는 String이 성능 면에서 좋지만, 문자열 추가/수정/삭제 등의 연산이 빈번하게 발생하는 알고리즘 에서는 성능이 좋지 않음.

2. StringBuilder, StringBuffer

  • Mutable 문자열
    String과 반대로 가변성(Mutable)하기 때문에 .append(), .delete()등의 API를 활용하여 동일 객체 내에서 문자열을 변경할 수 있음. 즉, 문자열의 추가/수정/삭제가 빈번하게 일어나는 경우라면 StringBuffer/StringBuilder를 사용하는 것이 좋음.

  • StringBuiler vs StringBuffer
    동기화의 유무로 차이를 나눌 수 있다.

    • StringBuffer : 동기화 키워드를 지원하여 멀티스레드 환경에서 안전(thread-safe).
      ※ String도 불변성을 가지기 때문에 멀티스레드 환경에서의 안정성을 가지고 있음.
    • StringBuilder : 동기화를 지원하지 않음. 즉, 멀티스레드 환경에서 적합하진 않지만, 이를 고려하지 않는 만큼 단일스레드에서는 StringBuffer보다 성능이 훨씬 뛰어남.

3. 정리

String : 문자열 연산이 적고 멀티쓰레드 환경일 경우
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우

profile
BE Developer

0개의 댓글