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 등을 할 경우, 새로운 객체를 만들게 되고, 이전 객체는 더이상 레퍼런스가 없으면 버려집니다.
'나만의 정리' 카테고리의 다른 글
자바 상속(extends), 추상클래스(abstract), 인터페이스(implements) 개념정리 (0) | 2018.07.12 |
---|---|
자바 접근 지정자 (0) | 2018.07.11 |
foreach문 (0) | 2018.06.21 |
자바에서 nextInt() 후 nextLine()을 할 때 주의해야 할 점 (0) | 2018.06.21 |
StringTokenizer 정리 (0) | 2018.06.19 |
댓글