ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • String, StringBuilder, StringBuffer의 차이
    Java/Basics 2019. 4. 6. 14:19

    ■String

    immutable(불변)

    - 한번 생성되면 할당된 메모리 공간이 변하지 않는다.

    - + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 

    다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이지 않는다. 

    새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 

    그 객체를 참조하도록 한다!

    - String은 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않다

    - 하지만, Immutable한 객체는 간단하게 사용 가능하고, 

    동기화에 대해 신경쓰지 않아도 되기 때문에(Thread-safe), 내부 데이터 공유가 자유롭다!



    StringBuffer / StringBuilder

    mutable(변함)

    - StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일하다.

    같은 추상클래스(AbstractStringBuilder)를 상속하고 있고 

    같은 인터페이스(java.io.Serializable, CharSequence)를 구현하고 있다.

    - 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 

    기존의 버퍼 크기를 늘리며 유연하게 동작. 

    Buffer와 Builder의 차이점 : 동기화 여부

    - StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 

    멀티스레드 환경에서도 동기화를 지원.

    - StringBuilder는 동기화를 보장하지 않음.

    - 따라서 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용

    - 그리고 단일스레드 환경이라면 StringBuilder를 사용 

    - 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 

    기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.



    기타 참고

    - 문자열 연산이 단순할 경우, String으로 +연산으로 한다.

    - 문자열 연산이 복잡할 경우, StringBuffer 또는 StringBuilder를 사용한다.

    - 단순히 성능만 놓고 본다면 연산이 많은 경우 

    StringBuilder > StringBuffer >>> String 순으로 효율적

    - 사실 JDK 1.5버전 이전에서는 문자열연산(+, concat)을 할 때, 

    조합된 문자열을 새로운 메모리에 할당하여 참조함으로 인해서 성능상의 이슈가 있었다. 

    그러나 JDK1.5 버전 이후에는 컴파일 단계에서 String 객체를 사용하더라도 

    StringBuilder로 컴파일 되도록 변경되었다. 

    그리하여 JDK 1.5 이후 버전에서는 String 클래스를 활용해도 

    StringBuilder와 성능상으로 차이가 없어졌다. 

     하지만 반복 루프를 사용해서 문자열을 더할 때에는 객체를 계속 추가한다는 사실에는 변함이 

    없다. 따라서 String 클래스를 쓰는 대신 스레드와 관련이 있으면 StringBuffer를, 

    스레드 안전 여부와 상관이 없으면 StringBuilder를 사용하는 것이 권장된다!














    출처: https://12bme.tistory.com/42?category=682904 [길은 가면, 뒤에 있다.]

    'Java > Basics' 카테고리의 다른 글

    자바 메모리 구조(Runtime Data Area)  (2) 2019.05.16
    String compare  (0) 2019.04.09
    Object class  (0) 2019.04.06
    jar,war,ear  (0) 2019.04.06
    JAVA String Format  (0) 2019.04.06

    댓글

Designed by Tistory.