Java
[Java] String VS StringBuffer
junga
2022. 10. 1. 23:21
String VS StringBuffer
- String 클래스의 인스턴스는 한 번 생성되면 값을 변경할 수 없다.
- StringBuffer 클래스는 값을 변경할 수도 있고, 추가할 수도 있다.
String은 덧셈(+) 연산자를 이용해 문자열을 결합하면, 내용이 합쳐진 새로운 String인스턴스를 생성한다.
따라서 문자열을 많이 결합할수록 공간을 낭비하고, 속도 또한 느려진다.
StringBuffer는 내부적으로 버퍼라는 독립적인 공간을 가진다.
버퍼의 기본 크기는 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 크기를 별도로 설정할 수도 있다.
인스턴스 생성 시 사용자가 설정한 크기보다 언제나 16개의 문자를 더 저장할 수 있도록 여유 있는 크기로 생성된다.
따라서 문자열을 바로 추가할 수 있으며, 공간의 낭비도 없고 속도도 빨라진다.
불변 클래스(immutable class) & 가변 클래스(mutable class)
- 불변 클래스: 인스턴스가 한 번 생성되면 그 값을 변경할 수 없는 클래스를 불변클래스라고 한다. ex) String
- 가변 클래스: 인스턴스의 값을 변경할 수 있는 클래스를 가변클래스라고 한다. ex) StringBuffer
가변클래스가 더 좋아보이는데 불변클래스는 언제 쓸까?
이렇게 불편하기만 할 것 같은 불변 클래스를 사용하는 이유는 멀티 스레드 환경에서 객체가 변화되는 상황이라면
불변 인스턴스를 사용하는 것이 좀 더 신뢰할 수 있는 코드를 작성할 수 있기 때문이다.
하나의 객체에 접근하면서 각각의 객체가 서로 영향을 주어서는 안되는 경우에 불변을 이용하면 값이 변하지 않는다는 점이 보장된다.
StringBuffer 주요 메소드
public class Main {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("str");
// append(): 인수로 전달된 값을 문자열로 변환 후, 마지막에 추가
sb.append(123);
System.out.println(sb); // str123
// capacity(): 현재 버퍼 크기를 반환
System.out.println(sb.length()); // 6
System.out.println(sb.capacity()); // 19 => 처음 문자열 3 + 버퍼 크기 16
// deleteCharAt(int index): 인덱스에 해당하는 문자를 제거
// delete(int start, int end): 인덱스 범위(start에서 end전까지)에 해당하는 부분 문자열을 제거
sb.deleteCharAt(0);
System.out.println(sb); // tr123
sb.delete(0, 2);
System.out.println(sb); // 123
// insert(int offset, 여러 type): 인수로 전달된 값을 문자열로 변환 후, 해당하는 인덱스에 값 추가
sb.insert(0, "str");
System.out.println(sb); // str123
// reverse(): 문자열의 인덱스를 역순으로 재배열한다.
sb.reverse();
System.out.println(sb); // 321rts
}
}