[JAVA] String vs StringBuffer vs StringBuilder 비교

2018. 7. 4. 16:41JAVA

[JAVA] String vs StringBuffer vs StringBuilder 비교


□ String

- Immutable(불변함)

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

- 문자열 연산(+, concat) 시, 새로운 String 객체 생성 후 연결된 문자열 저장 및 참조

- Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성

- 한 번 생성된 객체의 내부 내용을 변화시킬 수 없다.

- 문자열 연산이 많은 경우, 성능이 좋지 않다.

- 간단하고 동기화에 대해 신경쓰지 않아도 된다.(Thread-Safe), 내부 데이터를 자유롭게 공유 가능


□ StringBuffer, StringBuilder

- Mutable(변함, 변하기쉬움)

- 문자열 연산 등으로 기존 객체에 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작

StringBuffer vs StringBuilder    동기화 여부

- StringBuffer는 각 메서드 별로 Synchronized Keyword 가 존재, 멀티스레드 환경에서도 동기화 지원    → 멀티 스레드 환경

- StringBuilder는 동기화를 보장하지 않는다.                                                                                             단일 스레드 환경

- StringBuffer를 단일스레드 환경에서도 사용 가능하지만, 동기화 관련 처리 때문에 StringBuilder에 비해 성능이 떨어진다.



* JDK 1.5 이전

- 문자열 연산(+, concat) 시, 새로운 메모리에 할당하여 참조함으로 인해서 성능상의 이슈 존재

* JDK 1.5 이후

- 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경

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


단순 성능상으로 비교하자면,

StringBuilder > StringBuffer >>> String