[Java] String, StringBuffer, StringBuilder

선ㅎㅣ·2024년 10월 14일

Java

목록 보기
1/1

String

  • 불변(immutable)
  • 한번 생성되면 할당된 메모리 공간이 불변
  • + 연산자 또는 concat 메서드
    • 기존 문자열에 새로운 문자열을 붙이는 것 X
    • 새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고 그 객체 참조
      • String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성
      • 한번 생성된 객체의 내부 내용 변화 불가능
      • 기존 객체가 제거되면 Java의 가비지 컬렉션이 회수
  • 단점: 문자열 연산이 많은 경우, 성능이 좋지 않음
  • 장점:
    • 간단하게 사용 가능
    • 동기화에 대해 신경 쓰지 않아도 되기 때문에(Thread-safe),  내부 데이터를 자유롭게 공유 가능

StringBuffer

  • 가변(mutable)
  • 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 유연하게 늘림
  • 각 메서드 마다 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원
    • 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer 사용

StringBuilder

  • 가변(mutable)
  • StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일
  • 동기화를 보장X
    • 단일 스레드 환경이라면 StringBuilder 사용
      • 단일 스레드 환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아님
    • 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않음

정리

StringStringBufferStringBuilder
가변 여부불변가변가변
스레드 세이프 (Thread-safe)OOX
연산 속도느림빠름아주 빠름
사용 시점문자열 추가 연산이 적고, 스레드 세이프 환경에서문자열 추가 연산이 많고, 스레드 세이프 환경에서문자열 추가 연산이 많고, 빠른 연산이 필요한 경우 & 단일 스레드 환경일 경우

성능 비교

String

  • 짧은 문자열을 더할 경우 사용
  • 문자열 연산이 적고 변하지 않는 문자열을 자주 사용할 경우
  • 멀티쓰레드 환경일 경우

StringBuffer

  • 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
  • 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용
  • 동기화를 지원X → 단일 쓰레드이거나 동기화를 고려하지 않아도 되는 경우
  • 속도에서 StringBuffer 보다 성능이 좋음

StringBuilder

  • 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우
  • 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발하는 경우
  • 동기화를 지원X → 멀티 스레드 환경에서도 안전하게 동작

참고

0개의 댓글