[Assignment] StringBuffer와 String Builder의 차이점, 비교

열심히 사는 루피 🥰·2021년 8월 4일
0

과제 해결

목록 보기
1/2

스트링 버퍼/빌더의 필요성

  • 자바에서 스트링은 constant pool에 관리됩니다.
  • String + String 을 하면 그림과 같이 constant pool(heap)에 지속적으로 쌓이게 됩니다..!
  • 더불어 계속 새로 생성되는 String에 메모리를 할당하고 클래스를 생성하는데 시간도 더 걸리게 됩니다...

😥 그저,,, 우린 "012345678"이라는 결과가 필요한데, 이런 메모리 소모를 겪지 않을 방법이 필요하다!

스트링 버퍼와 스트링 빌더

StringBuffer 클래스는 내부적으로 버퍼를 가지고 있습니다.
append 함수로 string을 붙여쓰면 버퍼에 추가됩니다.

  • system.out.println 등 StringBuffer에 있는 내용을 스트링으로 만드는 그 순간!!! 에 constant pool에 1회 생성됩니다.

  • 따라서 스트링을 더할 때 stringBuffer나 StringBuilder를 쓰면 성능저하를 막을 수 있습니다 😃

  • 그런데,, 그 둘의 차이는 뭘까용? 🤔

stringBuffer, stringBuilder의 차이점

stringBufferstringBuilder
동기화 여부동기화 지원동기화 미지원
싱글 스레드 속도차이상대적 느림상대적 빠름
storageheapheap

가장 큰 차이는 stringBuffer는 동기화를 지원하고 stringBuilder는 지원하지 않는다는 것입니다.
따라서 멀티쓰레드라면, stringBuilder는 내가 원하는 결과를 주기 어려울수도 있습니다.. 😥

성능을 비교해볼까요??

싱글스레드에서 stringBuffer, stringBuilder의 성능 비교

  • 성능 결과 (StringBuilder WIN 🏆)
    - 싱글스레드에서 각자 0~20000까지 append를 했을 때 StringBuffer와 StringBuilder 의 결과의 길이는 88890으로 같았습니다.
    - 속도의 경우 수행마다 차이는 있지만 Builder가 빠른 경우가 많았습니다!
  • 코드
	/* 싱글쓰레드 환경에서 성능차이*/
        StringBuffer stringBufferSingleThread = new StringBuffer();
        StringBuilder stringBuilderSingleThread = new StringBuilder();


        System.out.println("[SINGLE THREAD TEST]");

        new Thread(()->{
            long start = System.currentTimeMillis(); //측정시작
            for(int i=0;i<20000;i++){
                stringBufferSingleThread.append(i);
            }
            long end = System.currentTimeMillis(); //측정종료
            
            System.out.println("StringBuffer length: " + stringBufferSingleThread.length() );
            System.out.println("StringBuffer time: " + (end-start) );
        }).start();


        new Thread(()->{
            long start = System.currentTimeMillis(); //측정시작
            for(int i=0;i<20000;i++){
                stringBuilderSingleThread.append(i);
            }
            long end = System.currentTimeMillis(); //측정종료
            System.out.println("StringBuilder length: " + stringBuilderSingleThread.length() );
            System.out.println("StringBuilder time: " + (end-start) );
        }).start();

멀티스레드에서 stringBuffer, stringBuilder의 결과 차이

  • 결과 (StringBuffer WIN 🏆)
    - 멀티쓰레드로 각 쓰레드에서 버퍼, 빌더에 append 하면 결과 string의 길이가 달랐습니다.
    • StringBuffer는 동기화를 지원하기 때문에 각 쓰레드에서 결과에 이어서 append하는 과정이 안전하게 설계되어 쭉-쭉- 추가됩니다.
    • 반면 StringBuilder는 멀티쓰레드에서 동기화를 지원하지 않기 때문에 각 쓰레드가 동시에 stringBuilder에 접근하면서 상호 방해되고, 상대적으로 StringBuffer보다 적게 append 된 것을 볼 수 있습니다.

  • 코드
 	System.out.println("=================");
        System.out.println("[MULTI THREAD TEST]");
        /* 멀티쓰레드 환경에서 수행 횟수 차이 */

        StringBuffer stringBufferMultiThread = new StringBuffer();
        StringBuilder stringBuilderMultiThread = new StringBuilder();

	//두 개의 쓰레드에서 각자 한 StringBuffer, StringBuilder에 접근
        new Thread(()->{
            for(int i=0;i<10000;i++){
                stringBufferMultiThread.append(i);
                stringBuilderMultiThread.append(i);
            }
        }).start();

        new Thread(()->{
            for(int i=0;i<10000;i++){
                stringBufferMultiThread.append(i);
                stringBuilderMultiThread.append(i);
            }
        }).start();

        new Thread(()->{
            try {
                Thread.sleep(1000);
                System.out.println("StringBuffer length : " + stringBufferMultiThread.length());
                System.out.println("StringBuilder length : " + stringBuilderMultiThread.length());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

결론은?

  1. 스트링을 더할때는 StringBuffer, StringBuilder를 쓰자.
  2. StringBuffer는 동기화를 지원하고, StringBuilder는 동기화를 지원하지 않는다.
  3. 멀티쓰레드 환경이라면 StringBuffer를, 싱글쓰레드이고 성능이 중요하다면 StringBuilder를 쓰도록 하자~

😍 참고했거나 참고하면 좋을 링크

  1. String의 Constant Pool에 대한 글
    https://starkying.tistory.com/entry/what-is-java-string-pool
  2. StringBuffer, StringBuilder, String 세가지의 차이
    https://ifuwanna.tistory.com/221
  3. StringBuffer, StringBuilder 결과 비교를 배운 글
    https://novemberde.github.io/2017/04/15/String_0.html
profile
반가워_! 세상아!

0개의 댓글