티스토리 뷰
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 |