티스토리 뷰


모든 개발자가 알면서도 지키지 않는 것이 있다. 바로 문자열 관련 부분이다. String 클래스는 잘 사용하면 상관이 없지만, 잘못 사용하면 메모리에 많은 영향을 준다.

String이 GC에 영향을 주는 것은 확실하다. 하지만, 이것만 고친다고 메모리가 효율적으로 사용된다는 것은 아니다. 성능 개선에 있어 작은 부분이지만 기본적인 성능 개선부터 유념하자는 의미이다.


StringBuffer 클래스와 StringBuilder 클래스


문자열을 만드는 클래스는 String, StringBuffer, StringBuilder가 가장 많이 사용된다. StringBuffer 클래스는 JDK 5.0에서 새로 추가되었다. StringBuffer 클래스나 StringBuilder 클래스가 제공하는 메서드와 동일하다. 차이점은 StringBuffer 클래스는 스레드에 안전하게(ThreadSafe) 설계되어 있으므로, 여러 개의 스레드에서 하나의 StringBuffer 객체를 처리해도 전혀 문제가 되지 않는다. 하지만 StringBuilder는 단일 스레드에서의 안전성만 보장한다. 그렇기 때문에 여러 개의 스레드에서 하나의 StringBuilder 객체를 처리하면 문제가 발생한다.


 생성자

 설명 

 StringBuffer()

 디폴트 생성자. 초기 16개의 문자를 저장할 수 있는 버퍼를 가진 객체를 생성한다.

 StringBuffer(CharSequence seq)

 CharSequence를 매개변수로 받아 그 seq 값을 갖는 버퍼를 가진 객체를 생성한다.

 StringBuffer(int capacity)

 용량 크기(capacity)로 지정된 문자를 저장할 수 있는 버퍼를 가진 객체를 생성한다. 

 StringBuffer(String str)

 str로 지정된 문자열과 추가로 16개의 문자를 더 저장할 수 있는 버퍼를 가진 객체를 생성한다.  


CharSequence는 인터페이스다. 구현체로는 CharBuffer, String, StringBuffer, StringBuilder가 있으며 StringBuffer나 StringBuilder로 생성한 객체를 전달할 때 사용된다.

StringBuffer나 StringBuilder로 값을 만든 후 굳이 toString을 수행하여 필요 없는 객체를 만들어서 넘겨주기보다는 CharSequence로 받아서 처리하는 것이 메모리 효율에 더 좋다.

많은 양의 문자열을 연산할 때 String을 쓰지 말아야 하는 이유는 String은 immutable 객체(생성 후 변경 불가한 객체)이기 때문이다. 그래서 연산할 때마다 새로운 String 클래스 객체가 만들어지고 이전 객체는 필요 없는 쓰레기 값이 되어 GC 대상이 된다. 이런 작업이 반복 수행되면서 메모리를 많이 사용하게 되고, 응답속도에도 많은 영향을 미치게 된다. 반면에 StringBuffer나 StringBuilder는 새로운 객체를 생성하지 않고, 기존에 있는 객체의 크기를 증가시키면서 값을 더한다.


버전에 따른 차이


위에 설명은 틀린 내용은 아니지만, JDK 5.0 이상을 사용 한다면 아래와 같이 StringBuilder로 변환된다. 예전에 JVM을 만든 SUN에서도 고민을 많이 한 기색이 역력하다. 컴파일할 때 아래와 같이 변환되어 개발자의 실수를 어느 정도는 피할 수 있게 된다는 것이다.

public class VersionTest { String str = "Here" + "is" + "a" + "samples."; public VersionTest() { int i = 1; String str2 = "Here" + "is" + i + "samples."; } }


public class VersionTest { public VersionTest() { str = "Here is a samples."; int i = 1; String str2 = (new StringBuilder("Here is ")) .append(i).append(" samples").toString(); } String str; }


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/11   »
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
글 보관함