StringBuilder는 말 그대로
String을 만드는 객체
이며, StringBuilder로 변경한 다음append()
나insert()
등의 기능을 처리할 수 있으며,java.lang.StringBuilder
에 소속되어 있다.
append()
를 사용하여 StringBuilder에 값을 저장한다.
저장되는 형태는 append(값) + append(값)인데, "값" + "값" 형태로 저장되어 값을 서로 붙인다.
StringBuilder sb = new StringBuilder();
sb.append(1);
sb.append(true);
sb.append('T');
sb.append(3.14);
sb.append("hello");
System.out.println(sb); // 1trueT3.14hello
StringBuilder를 선언한 후, 각 append()에 맞는 데이터타입을 모두 받아서 합쳐서 출력해 준다.
문자열 연산 "안녕" + "하세요" = "안녕하세요"
의 상위버전 느낌이다.
만약 hello가 포함되었는지 확인하기위해
sb.contains("hello");
이렇게 하면 StringBuilder가 이미 저 문장들은 한 문자열로 만들어 놓았기 때문에 "hello"라는 데이터가 따로 있지않아 코드가 실행되지 않는다.
대신 인덱스로 글자를 가져올 수 있다.
System.out.println(sb.charAt(1)); // t
System.out.println(sb.substring(0, 1)); // 1
위의 코드에 이렇게 코드를 짜주면 이렇게 인덱스 명령대로 출력된다.
만약 문자열 비교인 equals()
를 이용하여 StringBuilder
를 이용하여 만든 "1trueT3.14hello" 와 문자열
"1trueT3.14hello"를 비교하면 true
가 나올까?
System.out.println(sb.equals("1trueT3.14hello")); // false
답은 false
가 나온다. 왜냐하면 StringBuilder는 String이 아니고 문자열을 만드는 기계, Builder이기 때문이다.
그래서 항상 StringBuilder로 만든 문자열
은 반드시 마지막에 String으로 변환
시켜주어야 한다.
String result = sb.toString();
System.out.println(result.equals("1trueT3.14hello")); // true
간단하게 a-z를 출력하는 코드를 작성하여 단순히 스트링을 합치는 +
와 StringBuilder
의 성능을 비교해보았다.
String+String
String alphabet1 = "";
long begin1 = System.nanoTime();
for(char ch='a'; ch<='z'; ch++) {
alphabet1 += ch;
}
long end1 = System.nanoTime();
System.out.println((end1 - begin1) + " " + alphabet1); // 154285 abcdefghijklmnopqrstuvwxyz
StringBuilder
StringBuilder sb2 = new StringBuilder();
long begin2 = System.nanoTime();
for(char ch='a'; ch<='z'; ch++) {
sb2.append(ch);
}
long end2 = System.nanoTime();
String alphabet2 = sb2.toString();
System.out.println((end2 - begin2) + " " + alphabet2); // 33300 abcdefghijklmnopqrstuvwxyz
결론 :
String
은 불변(immutable)하기 때문에+
사용 시 기존값을 버리고 새로 할당해서 수행하기 때문에 나중에 코드가 늘어날 경우 급격히 느려진다.StringBuilder
는 변(mutable)하기 때문에 한번에 데이터를 받아 합쳐서 처리하기 때문에 빠르다.- 코드가 간단할 때는 상관없지만, 보통 1000번 이상 사용할 경우 StringBuilder가 작업을 처리하는데 훨씬 더 적은 시간을 소요한다. ( 성능이 더 좋다. )
append(값)
StringBuilder, StringBuffer 뒤에 값을 붙인다.
insert(인덱스, 값)
특정 인덱스부터 값을 삽입한다.
delete(인덱스, 인덱스)
특정 인게스부터 인덱스까지 값을 삭제한다.
indexOf(값)
값이 어느 인덱스에 들어있는지 확인한다.
substring(인덱스, 인덱스)
인덱스부터 인덱스까지 값을 잘라온다.
length()
길이를 확인한다.
replace(인덱스, 인덱스, 값)
인덱스부터 인덱스까지 값으로 변경한다.
reverse()
글자 순서를 뒤집는다.