
아래의 두 코드가 어떤점이 다를까?
code1)
//code1
public class StringProblem {
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String(" world");
String str3 = str1 + str2;
System.out.println(str3);
}
}
code2)
//code2
public class StringProblem {
public static void main(String[] args) {
String str4 = new StringBuffer().append("hello").append(" world").toString();
System.out.println(str4);
}
}
바로 new 연산자의 사용 빈도 차이이다.
자바에서는 new 연산자를 많이 사용하게되면 속도가 느려진다.
반면 StringBuffer 는 자기자신을 반환하기 때문에 새로 만들 필요 없이 한 번의 선언에서 계속 추가가 가능하다.
StringBuffer 에 대한 포스트
그렇기 때문에 StringBuffer 로 append 한 후에 스트링으로 바꿔서 사용하는것이 좋을때도 있다.
더욱 극단적인 예시를 들어보자.
아래 코드는 각각 for 문을 사용하여 *을 100개 출력 하고있다.
code1)
public class StringProblem {
public static void main(String[] args) {
//just use String
String str5 = "";
for(int i=0;i<100;i++){
str5 = str5 + "*";
}
System.out.println(str5);
}
}
문자열을 반복문 안에서 사용하는 것은 지양하는 것이 좋다.
문자열을 계속 더하거나, 수정하면 새로운 객체를 생성하게 된다.
새로운 객체를 과도하게 생성하면 속도가 느려질 가능성이 있다.
code2)
public class StringProblem {
public static void main(String[] args) {
//use StringBuffer.append()
StringBuffer bf1 = new StringBuffer();
for(int i=0;i<100;i++){
bf1 = bf1.append("*");
}
String str6 = bf1.toString();
System.out.println(str6);
}
}
for 문을 사용하여 StringBuffer 를 100번 append 해주고 있다.
마지막에만 문자열로 바꿔서 넣어주면 되기 때문에
첫 번째 코드보다 비교적 속도가 빠르다.