실무 코드를 살펴보다보니 String을 +하기보다는 StringBuilder나 StringBuffer를 통해 append하는 것이 많았다.
String에서 +가 효율성이 떨어진다고 듣기는 했는데, 구체적인 개념을 정리하기 위해 글을 쓴다.
String, StringBuffer, StringBuilder는 java.lang 패키지에 속한 클래스들이다.
별도로 import를 해주지 않아도 사용이 가능하다.
String
- 문자열
- implements Serializable, Comparable<String>, CharSequence
- jdk 1.5 이후부터 +연산은 StringBuilder 사용해 성능 최적화 (단, 여러줄에 걸쳐 +할 경우 StringBuilder도 여러번 선언)
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char[] value;
...
}
위는 String class를 decompile한 것의 일부이다.
char형의 배열을 final로 선언한 것이 보인다.
-> 초기값으로 주어진 String 값은 불변이다.
-> String + String의 결과는 새로운 String
=> String 주소값이 stack에 쌓이고 클래스는 Garbage Collector 호출되기 전까지 heap에 지속적으로 쌓임
==> 메모리 관리적인 측면에선 치명적!!!
StringBuffer
- thread-safe하고, 변경 가능한 문자열
- implements Serializable, CharSequence
- web이나 소켓 환경 같은 비동기 동작이 많은 경우에 자주 사용
StringBuilder
- 변경 가능한 문자열
- implements Serialiazable, CharSequence
append()
- StringBuffer와 StringBuilder에서 + 연산 대신 사용하는 함수
value에 사용되지 않고 남아있는 공간에 새로운 문자열이 들어갈 정도 크기가 있다면 그대로 삽입.
그렇지 않다면 value 배열의 크기를 2배로 증가시키며 기존의 문자열 복사+새로운 문자열 삽입.
실제로는 더 복잡하게 구현되어 있으나 핵심적인 부분은 동일하다.
참조
docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html
novemberde.github.io/2017/04/15/String_0.html
cjh5414.github.io/why-StringBuffer-and-StringBuilder-are-better-than-String/
'Develop > Java' 카테고리의 다른 글
[Ant] Unable to locate tools.jar. Expected to find it ... 에러 (0) | 2021.03.02 |
---|---|
[Json] Json의 개념과 형식 (0) | 2021.02.08 |
[java] this와 this() (0) | 2021.01.26 |
[JPA] 더티 체킹 (0) | 2021.01.18 |
역할, 책임, 협력 관점으로 객체지향 살펴보기 (0) | 2021.01.15 |