이는 String의 특성을 먼저 보는 것이 좋다.
다들 알다시피
String str1 = "가나다";
String str2 = "라마바";
str1 += str2;
System.out.println(str1);
를 한다면, 출력되는 문자열은 가나다라마바 일 것이다.
이때 String타입은 불변성을 갖기 때문에, 원래 str1이 갖고있던 "가나다"에 문자열이 추가되는 것이 아니라,
"가다나"는 GC ( garbage collector )의 처리대상이 되고, "가나다라마바"가 str1이 갖게되는 값이 된다.
즉 사용되는 메모리가 많아지는 것이다.
이로인해
StringBuilder와 StringBuffer가 사용되는데,
StringBuilder sb = new StringBuilder("가나다");
System.out.println("sb.toString() : "+sb.toString());
sb.append("마바사");
System.out.println("sb.toString() : "+sb.toString());
를 하게되면, 출력은
이 되고, 이 경우 Heap영역의 메모리를 더 적게 사용하게 된다.
당연히 String이 불변성으로 인해 값의 변화를 가져올때, 메모리를 더 사용한다했으니
StringBuilder와 StringBuffer는 가변성으로 인해 메모리의 절약을 할 수 있겠다.
이 둘의 차이는 동기화의 차이이고,
StringBuffer는 동기화를 하게되어 멀티스레드 환경에서 안전하고 ( thread-safe ) 대신 속도는 세가지 타입중에 가장 느리게 된다.
StringBuilder는 동기화를 하지 않아, 멀티스레드 환경에서 안전하지 않고, 속도는 String만큼 빠르다.
추가로 String은 동기화를 하여, 멀티스레드 환경에서 안전하다.
'알고리즘' 카테고리의 다른 글
분수의 덧셈 ( 프로그래머스 문제, 코드 없음 ) (1) | 2023.04.24 |
---|---|
BOJ3052 - 서로 다른 나머지의 개수 (0) | 2022.01.13 |
StringTokenizer (0) | 2022.01.11 |
EOF ( End Of File ) 과 while문 (0) | 2022.01.11 |
BOJ2439 - 별찍기 (0) | 2022.01.11 |