본문 바로가기

카테고리 없음

[JAVA] String, StringBuilder, StringBuffer

String, StringBuffer, StringBuilder 모두 문자열을 저장하고 관리하는 클래스다.

 

1) String

문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용할 수 있다.

문자열, 숫자, char 등은 연결할때 StringBuffer, StringBuilder 를 사용할 수 있다.

단순히 연결하는 경우 StringBuffer, StringBuilder를 굳이 쓰지 않고 + 연산자를 사용한다.

 

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

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

다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라,

새로운 String 객체를 만든 후, 여기에 연결된 문자열을 저장하고 그 객체를 참조하게 한다.

즉, String 클래스 객체는 힙 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성된다.

한번 생성된 객체의 내부 내용을 변경할 수 없다.

기존 객체가 제거되면 자바의 가비지 컬렉션이 회수한다.

 

String 객체는 이런 이유로 문자열 연산이 많은 경우 성능이 좋지 않다.

하지만 불변하는 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기 때문에

내부 데이터를 자유롭게 공유 가능하다.

 

2) StringBuffer / StringBuilder 

StringBuffer, StringBuilder는 String과 다르게 동작한다.

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

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

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

 

StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하며

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

반면, StringBuilder 는 지원하지 않는다.

멀티스레드 환경에서는 값 동기화 보장을 위해 StringBuffer를 사용하고

단일스레드 환경에는 StringBuilder 를 사용한다.

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

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

 

String은 짧은 문자열을 더할 경우 사용한다.

StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 

개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용한다.

StringBuilder 는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할때 사용한다.

 

연산이 많은 경우 성능이 좋은 순은

StringBuilder > StringBuffer > String 이다.

 

https://12bme.tistory.com/42

 

[자바] String, StringBuilder, StringBuffer의 차이

* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자..

12bme.tistory.com