String과 StringBuffer/StringBuilder의 차이를 간단하게 알아보자.
이들의 가장 큰 차이점은, String은 불변 속성을 갖고, StringBuffer/StringBuilder는 그렇지 않다는 것이다.
String은 내부 문자열을 수정할 수 없다. 다음 코드를 보면 다른 문자열에 결합해서 내부 문자열을 변경하는 것처럼 보이지만 사실 'ABCDEF'라는 새로운 String 객체를 생성하는 것이다. 그리고 data변수는 새로 생성된 String 객체를 참조하게 된다.
String data = "ABC";
data += "DEF";
출처 : 이것이 자바다
문자열 + 연산의 새로운 String 객체가 생성되고 이전 객체는 계속 버려지는 것(가비지 컬렉터로 들어간다.)이기 때문에 효율성이 좋다고는 볼 수 없다. 잦은 문자열 변경 작업을 해야한다면 String보다는 StringBuilder를 사용하는 것이 좋다.
StringBuilder는 내부 버퍼(데이터를 저장하는 메모리)에 문자열을 저장해두고 그 안에서 추가, 수정, 작제 작업을 하도록 설계되어 있다. 따라서 String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있다.
리턴 타입 | 메소드(매개변수) | 설명 |
---|---|---|
StringBuilder | append(기본값 / 문자열) | 문자열을 끝에 추가 |
StringBuilder | insert(위치,기본값 / 문자열) | 문자열을 지정 위치에 추가 |
StringBuilder | delete(시작 위치, 끝 위치) | 문자열 일부를 삭제 |
StringBuilder | replace(시작 위치, 끝 위치, 문자열) | 문자열 일부를 대체 |
StringBuilder | reverse() | 순서를 뒤집음 |
StringBuilder | setCharAt(int index, ahcr ch) | 주어진 문자를 치환 |
StringBuilder | indexOf(String s) | 값이 어느 인덱스에 들어있는지 확인 |
StringBuilder | subString(int start,int end) | start와 end 사이의 값을 잘라옴. |
String | toString() | 완성된 문자열을 리턴 |
코드 예시 :
StringBuilder sb=new StringBuilder();
sb.append("DEF");
sb.insert(0,"ABC");
sb.delete(3,4);
sb.toString();
System.out.println(sb);
결과 :
ABCEF
추가로 메소드 체이닝 (method chaining) 패턴을 이용할 수 있다. 아래처럼 사용하는 것이 메소드 체이닝 패턴이다
String str=new StringBuilder()
.append("DEF")
.insert(0,"ABC")
.delete(3,4)
.toString();
System.out.println(str);
결과 :
ABCEF
정리
StringBuilder는 문자열의 연산이 자주 일어나는 단일 쓰레드 환경에서 사용하는 것이 유리하다.