String, StringBuilder, StringBuffer : 이 셋은 이름이 비슷하지만 조금씩 다르다.
String은 아주 간단한 문법으로 객체 생성이 가능하다.
String s1 = "사과";
String s2 = new String("딸기");
그런데 String은 값이 변하지 않는다. 즉, 한번 생성된 것을 변경하는 것이 불가능하다는 뜻이다.
" + " 연산자 혹은 함수를 사용하여 문자열을 결합하면 String에 저장된 값이 변하는 것이 아니라, 이미 생성된 객체의 주소를 참고하여 새로운 객체가 생성되는 것이다.
문자열 결합 기능의 concat 함수를 이용하여 확인해보자.
String s1 = "사과";
String s2 = new String("딸기");
s1.concat("오렌지");
System.out.println(s1);
출력 : 사과
오렌지가 출력되지 않은 이유는, s1에 저장된 "사과"라는 값이 업데이트 되지 않고 "사과오렌지"라는 객체가 새로 생성되었기 때문이다.
즉, 새로운 객체가 파생되어 그 곳에 데이터가 저장되어서 "사과"가 출력된 것이다.
따라서 "사과오렌지"가 나오게 하려면 새로운 객체를 생성 후 s1에 다시 대입을 해주어야 한다.
s1 = s1.concat("오렌지");
System.out.println(s1);
출력 : 사과오렌지
String은 객체를 너무 많이 생성하게 되는데, 이는 차후 처리 속도가 느려지는 문제가 발생할 수도 있다. 데이터를 새로 업데이트 해야한다면 StringBuilder, StringBuffer를 사용하는 것이 처리 속도가 더 빠르다.
StringBuilder를 사용하여 사과오렌지가 출력되게 해보자.
StringBuilder test = new StringBuilder("사과");
test.append(" 오렌지");
System.out.println(test);
출력 : 사과오렌지
이 경우 test에 있는 "사과"가 "사과오렌지"로 업데이트 되었기 때문에 바로 사과오렌지가 출력된 것을 확인할 수 있다.
"사과"와 "오렌지"를 + 연산자를 이용하여 출력한다고 해보자.
System.out.println("사과" + "오렌지");
이 경우 생성되는 객체의 수는 3개이다 : "사과", "오렌지", "사과오렌지"
문자열 객체를 새로 생성하고 그것을 참조해서 다른 객체를 새로 만들기 때문에 여러개의 객체가 생성되는 것이다.
속도를 고려했을 때 + 연산자를 많이 사용하여 문장을 만들게 되면 사용자가 많아진 경우 처리 속도가 느려질 수 있으니 가능하면 덜 이용하는 것이 좋다.
처리 속도는 String < StringBuffer < StringBuilder 로 StringBuilder가 가장 빠르다!