[Java] String & StringBuffer & StringBuilder

YounDitt·2020년 9월 20일
0

[Java] String

목록 보기
2/3

문자열을 다루는 대표 클래스 3개

  1. String : Imutable & thread-safe
  2. StringBuffer : Mutable & thread-safe (synchronize keyword)
  3. StringBuilder : Mutable

1. String

  • Implemented Serialzable : Serialize 가능
  • Implemented CharSequence : 문자열(read-only)
  • Implemented Comparbale : 비교 가능
  • final class : String class 상속 불가
  • private final byte[] value : 외부에서 접근할 수 없고(private) 불변(Immutable)하며(final) byte 배열로 문자열이 저장된다.

    Java 9 버전부터 문자열을 저장하는 배열의 타입이 변경되었다.

    // 기존
    private final char value[]; 
    // 변경 후
    private final byte[] value

    기본 char형은 UTF-16기반의 2byte를 참조한다. 때문에 영어만 있어도 2byte를 차지한다.
    변경 후 문자열에 따라 Latin-1(1byte)와 UTF-16(2byte)로 나누어 지기 때문에, String이 차지하는 메모리공간이 절약되었다.
    (참고)

📌Imutable

String str = "Hello";
str = str.concat(" Android");


(이전 "Hello"의 주소는 GC로 회수된다.)

🐵장점

  • 불변성(Immutable)을 가지기 때문에 멀티스레드 환경에서 안전하다.(thread-safe)
  • 불변하기 때문에 단순히 읽는 조회연산에서 빠르다.

🙊단점

  • 문자열 추가/수정/삭제등의 연산이 빈번하게 일어나는 경우, String을 사용하면 힙 메모리에 많은 임시 가비지가 생성되어 힙 메모리부족으로 어플리케이션 성능에 영향을 끼칠 수 있다.
  • 계속 문자열 객체를 만드는 오버헤드가 발생한다.

2. StringBuffer & 3. StringBuilder

📌Mutable

StringBuilder str = new StringBuilder("Hello");
str.append(" Android");

🐵장점

  • 버퍼의 capacity를 동적으로 늘리며 메모리 값을 변경할 수 있다.
  • 연산횟수가 많아질 때 사용하기 유용하다.

🙊단점

  • 버퍼크기를 초기에 설정해줘야 해서, 객체생성속도가 String보다 느리다.

2. StringBuffer

📌Synchronize

  • 동기화 키워드를 제공하여 멀티스레드 환경에서 안전하다.(thread-safe)
  • web이나 소켓환경과 같이 비동기로 동작하는 경우가 많을 때는 StringBuffer를 사용하는 것이 안전하다.

3. StringBuilder

  • 동기화를 지원하지 않아 멀티스레드 환경에서 사용하기 적합하지 않다.
    단, 단일스레드에서 성능은 StringBuffer보다 뛰어나다.
  • 스레드가 동시에 StringBuilder에 접근하기 때문에 빠르다.(??)


출처 : http://tuandevnotes.com/

🙋‍♀️문자열 연산속도가 빠른것은?

StringBuilder > StringBuffer >> String

🙋‍♀️String은 어떻게 참조가 될까요?

Call by value로 참조가 된다?

🙋‍♀️String은 Call by Reference인데 왜 pool을 참조하는 String 값이 변경될 때 같이 변경되지 않을까?

🙌 String은 immutable하기 때문에 pool 내의 값을 변경하는게 아니라, 새로운 값을 생성한다.

👀 String에서 + 연산의 동작?

Java 5 이전 : StringBuffer 로 컴파일됨(아니라는 글도 있음??)
Java 6 이후 : StringBuilder 로 컴파일됨

런타임시 동적으로 문자열을 변경할 경우 String보다는 Buffer나 Builder사용(반복루프에서는 builder를 매번 새로 생성해서 성능이 좋지 못함.)

참고 1
참고 2

profile
Hello, Android

0개의 댓글