본문 바로가기
[개발] Programming/Java

자바 String, StringBuffer, StringBuilder 차이 점

by eatyourKimchi 2020. 4. 7.

 

String, StringBuffer, StringBuilder

 

문자열을 저장하기 위한 클래스 3가지. 나오는 결과물은 동일하나 완전 다른 특성을 갖는다.

별거 아닌 것 같은데 정신력이 흐려지면 헷갈린다. 그래서 이참에 셋을 비교 분석해본다.

 

 

 

차이점

 

String은 immutable 즉 불변 객체이다.

선언하면 저장된 문자열을 가공해도 여전히 동일한 공간이 할당되어 있다.

 

소스로 예를 들면 스트링 타입에 값을 선언하면 해당 사이즈로 메모리에 할당이 된다.

String tmp = "test string";

 

데이터를 바꾸면 Heap 메모리 내 String pool에 새로 공간을 할당하게 된다.

tmp + " adding a new string";

 

기존 객체는 null로 초기화해주기 전까지는 메모리를 차지하고 있어 비효율적이다.

그럼 String은 언제 써야하는가? 데이터가 자주 안 바뀌고 참조를 자주 할 때 사용하면 속도가 빠르다.

 

 

반면에 StringBuffer, StringBuilder은 mutable, 가변 객체이다.

새로 객체를 생성하지 않아도 문자열을 수정할 수 있다.

결국 문자열 연산이 잦은 경우 String 보다 훨씬 효율적이다.

 

StringBuffer은 동기화가 가능하기 때문에 멀티 스레드에 적합하며,

StringBuilder는 동기화가 안되기에 단일 스레드에 적합하며, 속도가 빠르다.

(둘의 속도차는 2배지만 워낙 짧기 때문에..)

 

 

 

결론

 

성능은 StringBuilder > StringBuffer > String

 

자바 1.5 이후로는 String으로 + 연산을 할 때 자동으로 StringBuilder로 변환하여 append() 한다고는 하지만, 일단 char[] 에 담아야 하고 new로 객체를 만들어주는 작업에서 부하가 많이 걸린다고 한다.

 

다른 블로그를 참고해보니 String으로 + 연산을 10만 번 이상 할 경우 속도가 매우 느려진다고 하니, 간단하고 문자열이 짧은 경우는 String을 사용해도 무관할 것 같다. 또 연산이 적고 참조를 많이 할 경우 String이 적합하다.

 

연산이 잦고 문자 데이터가 방대할 경우 StringBuilder 또는 StringBuffer를

 

 


참고자료: http://egloos.zum.com/deblan2/v/419830

댓글