문자열 사용할때 신나게 쓰는 String

그렇게 Java서적을 보면서 공부하다보면 StringBuffer란 녀석이 나옵니다.


이 둘의 차이점을 알아볼까 합니다.


1. 속도

속도를 비교해 보겠습니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class StringBufferDemo {
    public static void main(String[] args) {
        String s = "ABC";
        for(int i = 1 ; i < 4 ; i++){
            String string = new String();
            StringBuffer stringbuffer = new StringBuffer();
            StringBuilder stringbuilder = new StringBuilder();
            
            long startTime = System.currentTimeMillis();
    
            for(int loop = 0 ; loop < 100000 ; loop++){
                s+=string;
            }
            long endTime = System.currentTimeMillis();
            System.out.println("String ["+i+"] 번째 결과 : "+((endTime-startTime)/1000.0)+"초");
            
            startTime = System.currentTimeMillis();
            for(int loop = 0 ; loop < 100000 ; loop++){
                stringbuffer.append(s);
            }
            endTime = System.currentTimeMillis();
            System.out.println("stringBuffer ["+i+"] 번째 결과 : "+((endTime-startTime)/1000.0)+"초");
            
            startTime = System.currentTimeMillis();
            for(int loop = 0 ; loop < 100000 ; loop++){
                stringbuilder.append(s);
            }
            endTime = System.currentTimeMillis();
            System.out.println("stringBuilder ["+i+"] 번째 결과 : "+((endTime-startTime)/1000.0)+"초");
            System.out.println("\n");
        }
        
    }
}
cs

string, stringbuffer, stringbuilder 객체를 만들어 문자열 ABC를 100000번 이어 붙이는 일을 3번 수행했습니다.

다음과 같은 결과가 나왔습니다.





속도차이가 마..많이 나네요.(실제로 컴파일 하는데도 시간이 좀 걸립니다)

이렇게 알 수 있듯이  String > StringBuffer > StringBuilder 순이네요.


2. 메모리공간 사용

결론부터 얘기하면 String > StringBuffer == StringBuilder 입니다.

위의 소스코드에서 먼저 String+=s를 계속해서 수행을 하게 되면  계속해서 새로운 String클래스 객체가 만들어집니다.

처음 수행하면 ABC

두번째 수행하면 ABCABC

세번째 수행하면 ABCABCABC

네번째 수행하면 ABCABCABCABC

이런식이 될텐데요 그림으로 나타내보면


이런식으로 매번 새로운 객체를 만들며 그 이전에 만든 객체는 쓰레기가 되므로 가비지컬렉터(Gabage Collector)의 대상이 되버립니다.

이렇게 불필요하게 메모리를 낭비하는 String과는 달리 StringBuffer와 StringBuilder


새로운 객체를 생성하는게 아니라 기존 객체에서 크기를 증가시키면서 문자열을 더해갑니다.

그러면 StringBuffer와 StringBuilder는 같은걸까요..?

이 둘은 완전히 동일한 클래스이긴 합니다. StringBuilder클래스는 멀티쓰레드 프로그래밍에서 사용하면 문제가 발생합니다. 이 클래스는 단일쓰레드에서만 안전성을 보장합니다.


나름대로 정리를 해봤습니다.

String은 느리니까 이제 사용하지 말아야지... 라고 생각하면 안됩니다.

String은 짧은 문자열을 처리할때 사용하면 되고

StringBuffer는  쓰레드에 안전한 프로그램, 쓰레드에 안전한지 모를때 사용하면 되고

StringBuilder는 쓰레드에 안전한지 여부가 관계 없는 프로그램을 개발할 때에 사용하면 됩니다.