자바라는 걸 처음 배울때는 String밖에 몰랐다. 그래서 +로 여러개의 string을 붙이곤 했다. 그러다가 누군가가 StringBuffer라는 걸 쓰는 걸 처음 봤을 때는 엄청나게 신기했다. 그래도 교육들을 때는 바쁘고 정신없어서 계속 String만 써왔는데, 알고리즘 문제를 풀다보니 성능(시간과 메모리)에 신경을 안쓸 수 가 없게 된 터라 제대로 검색해서 찾아보게 되었다.
1. String
String 내용이 조금이라도 바뀌거나 다른 String과 결합하게 되면 객체를 만든다. 기존 객체는 garbage collection의 대상이 된다. 새로운 객체에 새 주로를 주므로 hash code도 변한다. 이러한 과정때문에 StringBuffer와 비교해서, 시간이 오래 걸린다.
2. StringBuffer
StringBuffer는 초기 크기를 지정해줄 수 있다. 그리고 StringBuffer에 저장하는 크기가 초과되면 자동으로 처음에 지정한 크기만큼 buffer를 늘려준다. StringBuffer는 말그래도 버퍼에서 내용물을 추가하고 삭제하기 때문에 주소값이 그대로 이고 새로운 객체를 생성하지 않는다.
3. StringBuilder
String으로 문자열을 +를 활용해 합치는 경우 정확히 어느 버전까지인지 모르겠는데요. 매번 String 인스턴스를 생성하는 방식이였어요. 그래서 성능상의 이슈가 많았죠. 이런 성능 이슈를 개선하기 위해 JDK 1.5 (@changhwa.oh 설명에 따르면) 버전 이후에는 컴파일 단계에서 StringBuilder로 컴파일 되도록 변경되었어요. 그래서 JDK 1.5 이후부터는 +를 활용해도 성능상에 큰 이슈는 없습니다.
StringBuffer, StringBuilder는 동기화 지원 여부입니다. 두 클래스가 제공하는 메소드는 같아요. 단, 메소드를 보면 StringBuffer는 각 메소드 별로 synchronized keyword가 존재하죠. 즉, 멀티 쓰레드 상태에서 동기화를 지원한다는 것이 다릅니다.
Slipp에서 위와 같은 글을 봤다.
일단은 여기까지만 정리한다.
'WEB > java' 카테고리의 다른 글
OR, AND 논리연산자 (0) | 2017.12.27 |
---|---|
[구글링] stack & queue (0) | 2017.12.20 |
[NOTE] Field, method in static method (0) | 2017.12.19 |
[생활코딩]제네릭 (0) | 2017.12.08 |
[자바의 정석] Collection Framework (0) | 2017.12.08 |