티스토리 뷰

반응형

String을 합치는 방법은 StringBuffer, StringBuilder, +연산, concat 메서드가 있다. 이 네 가지의 차이점을 Test를 통해서 알아보고자 한다.

 

아래는 테스트 코드와 코드를 통해 테스트한 결과이다.

class Test {
    static int count = 100000;

    public static void main(String[] args){
        testStringBuilder();
        testStringBuffer();
        testConcat();
        testAdd();
    }

    static void testStringBuilder() {
        long startTime = System.currentTimeMillis();
        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < count; i++) {
	        builder.append("add");
        }
        
        long endTime = System.currentTimeMillis();
        
        System.out.println("testStringBuilder : " + (endTime - startTime));
    }

    static void testStringBuffer() {
        long startTime = System.currentTimeMillis();
        StringBuffer buffer = new StringBuffer();
        
        for (int i = 0; i < count; i++) {
        	buffer.append("add");
        }
        
        long endTime = System.currentTimeMillis();
        
        System.out.println("testStringBuffer : " + (endTime - startTime));
    }

    static void testConcat() {
        long startTime = System.currentTimeMillis();
        String result = "";
        
        for (int i = 0; i < count; i++) {
        	result = result.concat("add");
        }
        
        long endTime = System.currentTimeMillis();
        
        System.out.println("testConcat : " + (endTime - startTime));
    }

    static void testAdd() {
        long startTime = System.currentTimeMillis();
        String result = "";
        
        for (int i = 0; i < count; i++) {
        	result += "add";
        }
        
        long endTime = System.currentTimeMillis();
        
        System.out.println("testAdd : " + (endTime - startTime));
    }
}

 

결과

testStringBuilder : 0
testStringBuffer : 16
testConcat : 4305
testAdd : 9988

 

테스트해서 나온 결과를 보면 StringBuilder, StringBuffer, concat 메서드, +연산 순으로 빠르다는 것을 볼 수가 있다.

 

차례로 보면 StringBuilder와 StringBuffer의 연산 방법은 똑같다. 하지만 한 가지 차이점이 있는데 StringBuffer와 StringBuilder의 동기화 지원 여부이다. StringBuffer는 동기화를 보장하기 때문에 멀티 스레드에서 사용할 수 있고 StringBuilder는 동기화를 보장하지 않기 때문에 싱글 스레드에서만 사용해야 한다. 그리고 동기화라는 기능을 수행하기 때문에 StringBuffer보다는 StringBuilder가 더 빠르다.

 

concat 메서드는 String을 합칠 때마다 새로운 String 객체를 만들고 만든 객체에 값을 저장한 후 만든 객체를 참조하기 때문에 느릴 수밖에 없다.

 

+연산은 사실 StringBuilder로 연산이 된다. 그런데 왜 +연산이 가장 느렸을까? 먼저 만약 반복문이 아닌 하나의 줄에 +연산을 하거나 StringBuilder의 append를 할 경우 성능은 같거나 +연산이 더 빠른 경우가 있다는데 그것은 컴파일러의 상수 최적화 때문에 그렇다고 한다.... 여하튼 아래 두 가지는 성능이 거의 같다.

1) "a"+"b"+"c"+"d"+"e"+"f".....

2) .append("a").append("b").append("c").append("d").append("e").append("f").....

 

즉 1)과 2)의 성능이 같은 것인데 이유는 +연산을 할 때 StringBuilder로 연산을 하기 때문이다. 그런데 왜 위의 Test에서는 +연산이 가장 느렸을까?

 

그것은 for문을 돌 때마다 새로운 StringBuilder를 생성한 후 append 하고 변수에 대입하기 때문이지 싶다.

 

 ** 결론 : 반복문을 사용할 경우 StringBuilder나 StringBuffer를 자신의 스레드 상황에 맞게 사용하고 여러 String을 한 번에 합칠 때는 +연산자를 사용하면 될 것 같다.

반응형

'java&spring' 카테고리의 다른 글

[Java] 연산자 모음  (0) 2017.01.08
[Java] 람다식  (0) 2016.12.17
@RestController VS @Controller  (0) 2016.11.01
@Async를 통한 비동기 처리  (0) 2016.10.08
replaceAll과 split에서의 주의점  (0) 2016.08.25
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2025/03   »
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 31