본문 바로가기
나만의 정리

StringBuffer를 사용하는 이유

by 코리늬 2018. 6. 29.

StringBuffer

자바에서 String은 불변객체이다. 즉, 한번 생성되면 그 내용을 바꿀 수 없다는 뜻이다.


String hello = "Hello";


라는 문장이 있을 때, 우선 "Hello"라는 문자열 인스턴스를 메모리에 생성한다.

그리고 그 레퍼런스를 hello라는 문자열 변수에 대입한다. hello는 "Hello"라는 문자열 자체는 아니고 단지

"Hello"라는 문자열 객체를 가리키는 레퍼런스이다. (C의 포인터와 비슷하다)


hello += " Mr,HarryPorter";

위 문장이 실행되면 hello 객체의 내용은 "Hello Mr,HarryPorter"가 될 것이다.

단순히 문자는 축적된다고만 생각하고 있었을 텐데, 내부적으로 보면


hello = new StringBuffer(hello).append(" Mr,HarryPorter").toString();

으로 변환됩니다. String 객체는 불변이기 때문입니다.


"Hello" 와 " Mr,HarryPorter"는 문자열 자체가 수정된 것이 아니라, Hello Mr,HarryPorter라는 새로운

문자열 객체가 생성되어 hello에 그 레퍼런스가 대입된 것이다.


따라서

String mySql = "SELECT";

mySql += "name, ";

은 한번 실행될 때마다 new StringBuffer를 반복하게 되므로 메모리에 효과적이지 않습니다.


그렇기 때문에

StringBuffer sb = new StringBuffer("SELECT");

sb.append("name, ");

이렇게 생성해줌으로써 임시적으로 생성되는 StringBuffer가 없어지게 되고 toString()또한 없어집니다.


StringBuffer는 내부적으로 String 객체가 아닌 char[ ] 를 사용하기 때문에 내용의 추가 및 삭제, 변환이 자유롭다.

 그래서 substring, replace 등을 할 경우, 새로운 객체를 만들게 되고, 이전 객체는 더이상 레퍼런스가 없으면 버려집니다.




댓글