프로그래밍/Backend

JAVA String, StringBuilder, StringBuffer

Ubar 2020. 8. 15. 00:22

자바로 문자열을 담을 때 주로 String을 사용한다.

하지만 상황에 따라 String, StringBuilder, StringBuffer를 구분해서 사용할 일이 생긴다.

 

1. String

가장 많이 사용하고 일반적인 자료형이다.

하나의 문자를 사용하는데는 문제 없지만 concat연산 시(+) 기존의 String 문자열을 수정하지 않고 각각의 String 변수를 합쳐 새로운 인스턴스를 생성한다.

왜냐하면 String은 byte배열이고 final이기 때문에 변할 수 없다.(immutable)

 

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    /**
     * The value is used for character storage.
     *
     * @implNote This field is trusted by the VM, and is a subject to
     * constant folding if String instance is constant. Overwriting this
     * field after construction will cause problems.
     *
     * Additionally, it is marked with {@link Stable} to trust the contents
     * of the array. No other facility in JDK provides this functionality (yet).
     * {@link Stable} is safe here, because value is never null.
     */
    @Stable
    private final byte[] value;

 

그렇게되면 메모리를 많이 사용하게 되므로 +연산이 많은 경우 StringBuilder를 사용하는게 좋다.

참고로 JDK 1.5 이후부터는 컴파일시 String을 StringBuilder로 자동 변환한다.

 

2. StringBuilder

StringBuilder는 String을 더할 때(Concat) 새로운 객체를 생성하지 않고 기존 데이터에 추가한다.

동기화를 지원하지 않아 멀티쓰레드 사용시에는 적합하지 않다.

대신 단일 Thread에서의 성능은 StringBuffer 보다 뛰어나고 메모리를 덜 사용한다.

 

3. StringBuffer

StringBuilder와 하는일은 같지만 차이점이 존재한다.

Thread들이 동시에 클래스에 접근할 수 있기 때문에 다른 Thread에서도 문자열 추가가 가능하다.(thread-safe하다)

 

정리하자면

  • String : 문자열 연산이 적고 Multi-thread일 때 사용
  • StringBuilder : 문자열 연산이 많고 Multi-thread일 때 사용
  • StringBuffer : 문자열 연산이 많고 Single-thread일 때 사용

 

'프로그래밍 > Backend' 카테고리의 다른 글

Execution failed for task ':compileJava'.  (0) 2020.03.06
gradle5 lombok error  (0) 2019.12.16