[Java] String, StringBuffer, StringBuilder

Chloe Choi·2020년 11월 28일
0

Java

목록 보기
1/5

Java로 알고리즘공부를 시작한 요즘, 스트링을 사용할 때면 String, StringBuffer, StringBuilder 중 뭘 쓸지 고민하게 된다. 자꾸 헷갈려서 정리 ~_~

String, StringBuffer, StringBuilder
문자열을 저장하고 관리하는 클래스들

String vs. 나머지

immutable, 즉 불변이라는 성질을 갖고있음 (나머지는 당연히 mutable, 가변이겠쥬?)

즉, new 연산을 통해 객체를 생성하면 그 객체의 메모리 공간은 절대 변하지 않습니다!
따라서 +, concat 연산을 하면 그 객체 자체가 변하는 게 아니라 새로운 string 객체를 새로운 메모리 공간에 만들게 됩니다~

  • 문자열 연산이 많아지면 계속해서 객체를 만드는 오버헤드가 존재하고, 기존의 문자열은 GC에 의해 제거되기 때문에 성능면에서 좋지 않겠죠?
  • 하지만 값이 변하지 않기 때문에 여러 스레드가 데이터를 공유하더라도 동기화를 신경 쓸 필요가 없고 안정성이 유지되겠네요ㅎㅎ (== Thread-safe)

    String 클래스는 문자열 연산이 적고 조회가 많을 때 멀티스레드 환경에 적합

그럼 이제 나머지들을 비교해봅시당

StringBuffer vs. StringBuilder

공통점

  • 가변객체입니다
  • AbstractStringBuilder를 상속받습니다.
  • 가변크기의 배열을 이용해 필요한 경우에만 문자열을 복사합니다.
    (필요한경우? value에 새로운 문자열이 들어갈 수 있는 곤간이 있다면 그대로 삽입. 그렇지 않다면 count *= 2의 수식으로 value 배열크기를 두배로 증가해 기존의 문자열을 복사하고 새로운 문자열을 삽입)

차이점

동기화 지원의 차이

  • StringBuffer -> 메소드에 synchronized 키워드가 존재, 멀티스레드 상태에서 동기화 지원 (Thread-safe)
  • StringBuilder -> 동기화 지원X, 멀티스레드 환경에 적합하지 않지만 동기화를 신경쓰지 않아 싱글스레드 환경에서 연산처리가 빠름

    (+ 동기화차이 ex. vector, ArrayList 이것두 나중에 간단히 정리해야겠다 !!)

정리

  • String: #불변객체 #Thread-safe #멀티스레드환경
  • StringBuffer: #가변객체 #동기화지원 #Thread-safe #멀티스레드환경
  • StringBuilder: #가변객체 #빠른연산 #싱글스레드환경

profile
똑딱똑딱

0개의 댓글