String 은 값을 변경할 때 마다 새로운 객체를 생성하기 때문에 일반적으로 값을 변경하면 비효율적이다.
String str = "Java";
String str = "New Java";
Java
복사
위 그림처럼 String 안의 내용이 바뀌면 가리키는 주소 값이 바뀌고, 기존의 값은 메모리 영역에 남아있다. (JVM의 GC가 처리)
효율적으로 메모리를 관리하기 위해서, StringBuffer 와 StringBuilder 가 존재한다.
StringBuffer와 StringBuilder의 차이
그렇다면 동일한 API를 가지고 있는 StringBuffer, StringBuilder의 차이점은 무엇일까?
가장 큰 차이점은 동기화의 유무로써 StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 입니다. 참고로 String도 불변성을 가지기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있습니다.
반대로 StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다.
출처: https://ifuwanna.tistory.com/221
StringBuffer / StringBuilder 메서드
1. append()
문자열을 추가한다.
java.lang.StringBuilder sb = new java.lang.StringBuilder("123");
sb.append(4567); // 4567 추가
Java
복사
결과
1234567
Java
복사
2. delete()
문자열을 삭제한다
java.lang.StringBuilder sb = new java.lang.StringBuilder("123456");
sb.delete(0, 2); // 0 번째부터 2개 지움
Java
복사
결과
3456
Java
복사
3. replace()
문자열을 교체한다
java.lang.StringBuilder sb = new java.lang.StringBuilder("123456");
sb.replace(0, 3, "AB"); // 0 번째부터 3개를 "AB"로 교체함
Java
복사
결과
AB456
Java
복사
4. reverse()
문자열을 뒤집는다
java.lang.StringBuilder sb = new java.lang.StringBuilder("123456");
sb.reverse(); // 문자열 뒤집기
Java
복사
결과
654321
Java
복사
5. substring()
문자열 추출
java.lang.StringBuilder sb = new java.lang.StringBuilder("123456");
String sub = sb.substring(2, 4); // 2 부터 3(4 - 1)까지 추출
System.out.println(sub);
Java
복사
결과
34
Java
복사
추출 시 index - 1 의 값을 추출한다.
위 코드에서 substring(2, 4) 의 경우, 2번째 인덱스부터, 4 - 1 인 3번째 인덱스 까지 추출한다.
문자열 | 1 | 2 | 3 | 4 | 5 | 6 |
index 값 | 0 | 1 | 2 | 3 (4 - 1) | 4 | 5 |
substring()을 활용한, 문자열 회전 출력 예제
import java.util.Scanner;
public class StringBuilder_2 {
public static void main(String[] args) {
// 입력받은 문장 회전회오리
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
for(int i = 0 ; i <= str.length() ; i ++) {
System.out.print(str.substring(i));
System.out.println(str.substring(0 ,i));
}
}
}
Java
복사
결과
회전회오리
전회오리회
회오리회전
오리회전회
리회전회오
회전회오리
Java
복사