문자열을 이어 붙일 때 String의 경우 Concat(value)
또는 + "value"
를 이용해 붙일 수 있다.
StringBuffer
와 StringBuilder
는 concat
혹은 +
을 사용하지 않고 문자열을 이어 붙이기 위해 사용하는데 과연 어떤 상황에 적합할까?
String은 불변(immutable)한다. 따라서 값을 변경할 수 없다. .concat
혹은 +
을 사용한 값 변경은 기존에 String에 들어있던 값을 버리고 새로 값을 할당하는 것이다. 따라서 concat
이나 +
를 무분별하게 사용할 경우 속도가 현저히 느려지게 된다.
String에 concat
또는 +
를 1000번 이상 하게되면 속도가 너무 느려져 비효율적이므로
StringBuffer
나 StringBuilder
를 사용하라는 것이다. 이 둘은 값을 버리고 새로 할당하는 것이 아니라 변경하기 때문에 .concat
에 비해 독보적으로 빠른 것을 확인할 수 있다.
StringBuffer
는 공통 메소드가 동기화되므로 멀티 쓰레드
환경에서는 StringBuffer
를 사용하는 것이 안전하고 (값이 예상치 못하게 변경되는 것을 방지한다.)
그 외에는 StringBuilder
가 성능이 뛰어나기에 StringBuilder를 사용해주면 된다.
sb.append(value);
// StringBuffer, StringBuilder 뒤에 값을 이어 붙인다. (concat 또는 + 처럼)
sb.insert(index, value);
// 특정 인덱스부터 값을 삽입한다.
sb.delete(index, value);
// 특정 인덱스부터 인덱스까지 값을 삭제한다.
sb.indexOf(value);
// 값이 어느 인덱스에 들어있는지 확인한다.
sb.substring(index1, index2);
// 인덱스부터 인덱스까지 값을 잘라온다.
sb.length();
// 길이 확인
sb.replace(index1,index2, value);
// 인덱스부터 인덱스까지 값으로 변경
sb.reverse();
// 글자 순서를 뒤집는다.
concat
, +
사용 시 기존 값을 버리고 새로 할당하여 1000번 이상 수행할 경우 급격하게 느려진다.concat
, +
를 1000번 이상 사용하는 경우 속도가 급격하게 느려지기 때문에 해당 상황에는 변하는(mutable) StringBuffer
와 StringBuilder
를 사용한다.StringBuffer
는 공통 메소드 동기화로 인해서 멀티 쓰레드
환경에서만 사용한다.StringBuilder
를 사용하면 된다.public static void main(String[] args){
String s = new String("s");
s = s.concat(" 붙이기");
s = s + " 붙이기";
// String은 불변(immutable)하기 때문에
// 기존 것을 버리고 새로 할당하는 식으로 사용한다.
StringBuffer sbuffer = new StringBuffer("SB");
sbuffer.append(" 붙이기");
StringBuilder sbuilder = new StringBuilder("SB");
sbuilder.append(" 붙이기");
// StringBuffer, StringBuilder는 변하기(mutable) 때문에
// 기존 것에서 append를 사용해서 값 변경 가능
sbuilder.append("붙이기"); // 삽입
sbuilder.insert(0, "ASDASD"); // 중간에 삽입
sbuilder.delete(3, 7); // 자르기
sbuilder.indexOf("ASDB"); // index 확인
sbuilder.substring(0, 4); // 자르기
sbuilder.length(); // 길이 확인
sbuilder.replace(0, 4, "CCCC"); // 글자 바꾸기(0부터 4번 째 글자를 CCCC로 변경)
System.out.println(sbuilder);
System.out.println(sbuilder.indexOf("붙이기붙이기"));
System.out.println(sbuilder.substring(0, 4)); // substring 예제
System.out.println(sbuilder.reverse()); // 순서 뒤집기
System.out.println(sbuilder.length()); // length 예제
}