티스토리 뷰

String은 immutable 하고, StringBuffer는 mutable하다.


String은 한번 생성되면 불변한다? 문자열을 더할 경우("Hello" + "World"), 새로운 String객체를 생성한 후 값("Hello World")을 담아 리턴한다는 말이다.

(기존의 객체들 에 담긴 값("Hello", "World")이 변하지 않음)

따라서, String은 짧은 문자열을 더할 경우에나 사용하는 것이 좋다고 한다. (새로운 객체를 생성하여 리턴하므로..)


StringBuilder는 스레드에 안전한지의 여부와 전혀 관계없는 프로그램을 개발할 때 사용하면 좋다.

만약 메서드 내에 변수를 선언했다면, 해당 변수는 그 메서드 내에서만 살아있으므로, StringBuilder를 사용하면 된다. StringBuffer는 스레드에 안전한 프로그램이 필요할 때 사용한다. 만약 클래스에 static으로 선언한 문자열을 변경하거나, singleton(JVM에 객체가 하나만 생성되는 클래스)으로 선언된 클래스에 선언된 문자열일 경우에는 이 클래스를 사용해야만 한다.

SLiPP, http://fowler.egloos.com/1243657 참조



Spring 4.0 프로그래밍 저자 최범균 님 블로그(http://javacan.tistory.com/entry/39)에서는 "StringBuffer 객체의 생성 및 toString() 메소드를 통한 String 객체의 생성을 반드시 필요로 하므로 더 많은 시간 및 메모리 자원의 낭비를 초래한다. 그에 비하여, String 클래스는 StringBuffer 클래스와 비교하여 인스턴스화를 통하여 객체를 생성할 때 상대적으로 적은 자원을 소모하며, toString() 메소드를 통하여 String 객체로 바꿀 필요가 없다." 고 하고 있어 자체적인 테스트없이 StringBuffer가 성능이 좋을 것이라 판단하지 말라고 하고 있다.

(또한 최근 WAS나 시스템이 JDK 5.0이상에서는 concat의 경우 컴파일러에서 String을 StringBuilder로 변환함으로써 성능 이슈를 해결했다고 한다.)


반면, 자바 성능 튜닝 이야기(이상민 저)에서는 StringBuffer나 StringBuilder로 값을 만든 후 toString을 수행하여 필요없는 객체를 만들어 넘기지 않고, CharSequence로 받아서 처리함으로써 메모리 효율을 높일 수 있다고 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
public class StringBufferTest1{
    public static void main(String args[]) {
        StringBuilder sb=new StringBuilder();
        sb.append("ABCDE");
        StringBufferTest1 sbt = new StringBufferTest1();
        sbt.check(sb);
 
    }
    public void check(CharSequence cs) {
        StringBuffer sb=new StringBuffer(cs);
        System.out.println("sb.length="+sb.length());
    }
} 결과 : sb.length=5
>

(그리고 concat의 경우에만 String을 StringBuilder로 변환하기때문에, + 등으로 반복 루프를 사용해서 문자열을 더할 때는 객체를 계속 생성한다는 사실에는 변함이 없다고 한다. 이 작업이 반복 수행되면 메모리를 많이 사용하게 되고, 응답속도에도 영향을 미치게 된다. 또한 GC를 빈번히 수행함에 따라 CPU를 사용하게 되고 시간도 많이 소요된다.)


따라서, 각 상황에 맞춰 테스트를 해보아야 하겠지만, 짧은 문자열의 경우엔 String을, 스레드와 관련이 있으면 StringBuffer를, 스레드 안전여부와 상관없다면 StringBuilder를 사용하는 것이 좋은 것 같다.



댓글
링크
최근에 달린 댓글
«   2024/04   »
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
Total
Today
Yesterday