모든 개발자가 알면서도 지키지 않는 것이 있다.
바로 문자열 관련 부분이다.
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를 사용하면 된다.
'Language > ☕️Java' 카테고리의 다른 글
JVM 아키텍처 1탄 - Class Loader SubSystem (0) | 2021.12.08 |
---|---|
Java Collections 시간 복잡도 (0) | 2021.12.03 |
Java 직렬화란(Serialization)? (0) | 2021.08.19 |
class파일로 컴파일 후, FTP를 통한 배포에서 발생한 문제. (UnsupportedClassVersionError ) (0) | 2021.08.14 |
자바란? (Java Programming Language) (1) | 2020.06.15 |
댓글