코딩하는 오징어

String vs StringBuffer vs StringBuilder 본문

Language/Java

String vs StringBuffer vs StringBuilder

코딩하는 오징어 2018. 6. 3. 23:58
반응형

이 글에서 각 클래스의 사용법을 설명하지는 않겠다. 각 클래스들의 특징과 성능적인 관점에서 비교해보고자 포스팅을 하는 것이기 때문이다.


비교


코드를 먼저 보자.

더할 값(value)에서 임시로 사용되는 객체가 생성되지 않도록 하기 위해 final String으로 지정하였다. 실행 결과를 살펴보자.


응답시간


주요 소스 부분

응답 시간(ms)

비고

str += value

95,801.41ms 

95초

strBuffer.append(value)

247.48ms

0.24초 

strBuilder.append(value)

174.17ms

0.17초 


String 클래스의 문제점이 보이는가?? 이게 끝이아니다.


메모리 사용량


주요 소스 부분

메모리 사용량(bytes)

생성된 임시 객체 수

비고

str += value

100,102,000,000

4,000,000

약 95Gb

strBuffer.append(value)

29,493,600

1,200

약 28Mb

 trBuilder.append(value)

29,493,600

1,200

약 28Mb


응답 시간 String보다 StringBuffer가 약 367배 빠르며, StringBuilder가 약 512배 빠르다. 메모리는 StringBuffer와 StringBuilder보다 String에서 약 3,390배 더 사용한다.이러한 결과가 왜 발생하는지 알아보자.


str += value;


str에 value를 더하면 새로운 String 클래스의 객체가 만들어지고, 이전에 있던 str객체는 필요 없는 쓰레기 값이 되어 GC대상이 된다.


  • str += value;

 주소

값 

100 

"abcde" 


  • str += value;

주소

값 

150 

"abcdeabcde"


  • str += value;

주소

값 

200 

"abcdeabcdeabcde"



String 클래스를 이용하여 연산하게 된다면 위와 같은 상황이 발상하는 것이다. 연산이 이루어질 때마다 새로운 객체가 생성되고 이전 객체는 GC대상이된다.


  • strBuilder.append(value);

주소

값 

100 

"abcde" 


  • strBuilder.append(value);

주소

값 

100 

"abcdeabcde"


  • strBuilder.append(value);

주소 

값 

100 

"abcdeabcdeabcde"


StringBuffer나 StringBuilder는 String과는 다르게 새로운 객체를 생성하지 않고, 기존에 있는 객체의 크기를 증가시키면서 값을 더한다. 그럼 위 클래스들은 어느 상황에 쓰이면 좋을까??

  • String은 짧은 문자열을 더할 경우 사용한다.
  • StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다.(동기화 됨)
  • StringBuilder는 스레드에 안전한지의 여부와 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다.(동기화가 안됨)


버전에 따른 차이


JDK 5.0이상을 사용한다면 사실 결과가 달라진다. 자바 컴파일러가 문자열을 더하는 코드를 자동으로 StringBuilder의 append함수로 변환 시키기 때문이다.


참고서적 : 자바 성능 튜닝 이야기



반응형

'Language > Java' 카테고리의 다른 글

Java에서의 인터럽트 (interrupt)  (0) 2019.05.01
CompletableFuture Manual  (0) 2019.04.21
java 8 Stream이란?  (0) 2018.04.22
java 8 람다식이란?  (0) 2018.04.17
Comments