[JAVA] String, StringBuilder, StringBuffer

신명철·2022년 3월 12일
0

JAVA

목록 보기
5/14

들어가며

JAVA 에는 문자열을 다루는 대표적인 클래스로 String, StringBuilder, StringBuffer 가 있다. 위 클래스의 차이점에 대해서 짚고 넘어가고자 한다.

String vs StringBuilder/StringBuffer

String 객체와 StringBuilder/StringBuffer의 가장 큰 차이점은 String 객체는 불변(Immutable)의 속성을 가진다는 점이다.

String str = "hello";
str += "world";

String 의 기존의 값이 변경되었을 때, 우리는 String 객체가 참조하고 메모리의 value 자체가 변했을 것이라고 생각한다. 하지만 실제로는 새로운 문자열hello world를 생성하고 메모리를 할당해 str를 참조시키게 된다.

즉, 기존의 문자열을 변경할 때마다 새로운 객체를 생성하는 것이다. 기존 문자열은 GC의 제거 대상이 되어 삭제가 된다.

잦은 String 객체 연산은 Heap 메모리 영역에 임시 Garbage가 생성되고, 성능에 치명적인 영향을 끼칠 수도 있다.

반면, StringBuffer/StringBuilder 같은 경우 가변성을 가지기 때문에 .append(), .delete()등의 API 로 동일 객체내의 value 자체를 변경하는 것이 가능하다. 따라서 잦은 연산이 필요한 경우, StringBuffer/StringBuilder를 사용하도록 하자.

StringBuffer vs StringBuilder

StringBuffer와 StringBuilder의 가장 큰 차이점은 동기화 여부이다.

StringBuffer 의 경우 각 메서드별로 Synchronized Keyword가 존재해 동기화를 지원하지만, StringBuilder 는 동기화를 지원하지 않는다.

멀티 스레드 환경이라면 StringBuffer를 이용해 Thread-Safe 하게 사용하도록 하고, 싱글 스레드 환경이라면 StringBuilder를 이용하도록 하자.

StringBuffer가 동기화 관련 처리로 인해 StringBuilder보다 성능이 좋지 않다.

profile
내 머릿속 지우개

0개의 댓글