본문 바로가기
Language/☕️Java

String을 쓰지 말라는 이유

by 발개발자 2020. 6. 16.
반응형

모든 개발자가 알면서도 지키지 않는 것이 있다

바로 문자열 관련 부분이다.

String 클래스는 사용하면 상관없지만, 잘못 사용하면 메모리에 많은 영향을 준다.

 

먼저 String 클래스를 잘못 사용한 사례를 보자.

 

 

 

 

 

음.. 약 5만번의 strSQL += 이라는 작업을 수행한다.

 

 

이를 여러번 돌려봤는데 거의 다 6초가 나왔다. 

이는 각자 PC환경에 따라 시간의 차이가 있을 것이다.

단순히 String 작업만 했는데 이렇게도 오래 걸렸다. 

 

그렇다면 해결방법을 찾아보자.

 

 

StringBuffer 클래스와 StringBuilder 클래스

오늘의 주인공들이다.

JDK 5.0 기준으로 문자열을 만드는 클래스는 두개가 가장 많이 사용된다.

여기서 StringBuilder 클래스는 JDK 5.0에서 새로 추가 되었다.

먼저 StringBuffer클래스는 스레드에 안전하게 설계되어 있으므로, 여러 개의 스레드에서 하나의 StringBuffer 객체를 처리해도 전혀 문제가 되지 않는다.

하지만 StringBuilder 단일 스레드에서의 안전성만을 보장한다.

따라서 여러 개의 스레드에서 하나의 StringBuilder 객체를 처리하면 문제가 발생한다.

음... 큰 속도 차이가 안나면 StringBuffer를 쓰는게 더 안전한 것 같다. 

 

 

1. StringBuffer 사용해보자. 과연 속도의 변화가 일어났을까.

 

 

 

0.004 거의 0초다.

 

 

 

2. StringBuilder 비슷한 속도를 보여준다. 과연 둘중 뭐가  빠를까..

 

 

3. 1000만번 돌린 StringBuffer

 

 

4. 1000만번 돌린 StringBuilder

 

 

여러 번을 돌려봐도 StringBuilder 근소우위로 빠른 같다.

 

 

String += 이렇게 속도차이가 나는 것일까?

 

String += 방식은 더할때마다 계속 새로운 String 클래스의 객체가 만들어지게 된다.

String strSQL = "sql";

strSQL += "abcde";

=> String strSQL = new String(strSQL  + "abcde"); 똑같다는 것이다

 

그러니 += 형식으로 계속 새로운 String객체를 생성하는 것이다.

원래 있던 String객체는 GC 대상이 되고, 계속 새로운 String객체가 생성된다는 것이다. 

얼마나 메모리 낭비가 크단 말인가!

 

 

 

그렇다면 StringBuffer StringBuilder 어떻게 작동되는지 알아보자.

StringBuffer StringBuilder String 다르게 새로운 객체를 생성하지 않고,

기존에 있는 개체의 크기를 증가시키면서 값을 더한다.

왜냐하면 String과 반대로 mutable 즉, 가변적으로 사용할 수 있기때문이다.

따라서, StringBuilder sb = new StringBuilder();

최초의 메모리를 생성하고, 메모리를 계속 유지하면서 append 곳에 값을 가변적으로 수정해주는 것이다.

 

 

그렇다면 이제 언제 String 쓰고 언제 StringBuffer StringBuilder 써야하는지 정리해보자

 

  • String 짧은 문자열을 더할 경우 사용한다.
  • StringBuffer 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다. 만약 클래스에 static으로 선언한 문자열을 변경하거나, singleton으로 선언된 클래스에 선언된 문자열일 경우에는 클래스를 사용해야만 한다.
  • StringBuilder 스레드에 안전한지의 여부와 전혀 관계 없는 프로그램을 개발할 사용하면 좋다. 만약 메서드 내에 변수를 선언했다면, 해당 변수는 메서드 내에서만 살아있으므로, StringBuilder 사용하면 된다.
반응형

댓글